在使用音频时,需要用到MediaPlayer,除了一些基础的方法之外,比较难掌握的就是设计播放点的调转的地方,进过反复调试,我最终找到一个可以让getCurrentPosition()和seekTo(int)发挥作用的方法。

一、 布局代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <RelativeLayout android:id="@+id/adcontainer"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_alignParentTop="true">
</RelativeLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/play"
android:id="@+id/play"
android:layout_alignParentTop="true"
/>
<EditText
android:id="@+id/seek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/play"
android:layout_alignParentLeft="true"
android:textColor="#ff000000"
android:ems="7"
android:hint=""
/>
<Button
android:id="@+id/go"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/seek"
android:text="@string/go"
/>
<TextView
android:layout_below="@+id/seek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"
android:id="@+id/text"
/> </RelativeLayout>

上述布局主要有以下几个部件:“播放/停止”按钮Play,“调整”按钮Go,跳转时间(毫秒)输入框,相关提示信息显示界面。

二、MainActivity代码

package com.kavinapps.androidk.audio;

import java.io.IOException;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; public class MainActivity extends Activity { private static final String TAG = "AudioPlayActivity";
private MediaPlayer mMediaPlayer;//定义音频控件
private int mPosition;//记录音频文件播放的位置
private TextView mTextView;
private EditText mEditText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("音频测试V0.0.3"); mTextView = (TextView)findViewById(R.id.text);
mEditText = (EditText)findViewById(R.id.seek); mMediaPlayer = new MediaPlayer();
mMediaPlayer = MediaPlayer.create(this, R.raw.music);//将音频文件放到里面
mMediaPlayer.setLooping(false);//不循环播放 mPosition = mMediaPlayer.getCurrentPosition();//保存当前播放点
//mMediaPlayer.seekTo(mPosition);
mTextView.setText("开始处:" + mPosition +'\r'+'\n');
mEditText.setInputType(InputType.TYPE_CLASS_NUMBER);//输入类型为数字 Button playButton = (Button)this.findViewById(R.id.play);
Button goButton = (Button)this.findViewById(R.id.go);
ButtonClickListener listener = new ButtonClickListener();//定义按键监听器
playButton.setOnClickListener(listener);
goButton.setOnClickListener(listener); } private final class ButtonClickListener implements View.OnClickListener{ @Override
public void onClick(View v) {
// TODO Auto-generated method stub Button button = (Button) v;//得到button
try{
switch(v.getId()){//通过传过来的button,可以判断button的类型
case R.id.play://播放
if(mMediaPlayer.isPlaying()){
stop();
mPosition = mMediaPlayer.getCurrentPosition();//保存当前播放点
mTextView.setText(mTextView.getText()+"段落:" + mPosition +'\r'+'\n');
}else{
play();
}
break;
case R.id.go://进入预设的时间
play();//必须先用play()初始化,不然会有错误产生,而是也无法调到设定的时间
stop();
Log.i(TAG,"按下Go键");
Log.i(TAG,"设定的跳转位置是mPosition= "+mPosition);
mTextView.setText(mTextView.getText()+"设定点:" +(mEditText.getText().toString()) +'\r'+'\n');
mMediaPlayer.seekTo(Integer.parseInt((mEditText.getText().toString())));
//mMediaPlayer.seekTo(mPosition);
//mMediaPlayer.seekTo(30000);//调到30s
Log.i(TAG,"跳转到的位置是mPosition= "+mMediaPlayer.getCurrentPosition());
play();
}
}catch (Exception e){
Log.e(TAG,e.toString());
}
}
}
private void play() throws IOException{ //此过程可能抛出异常
// TODO Auto-generated method stub
mMediaPlayer.start();//播放
}
private void stop() throws IOException{ //此过程可能抛出异常
// TODO Auto-generated method stub
mMediaPlayer.pause();
}
//关于播放位置的确定
/*
* mPosition = mMediaPlayer.getCurrentPosition();//保存当前播放点
* mMediaPlay.seekTo(mPosition);
* */ @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
///getMenuInflater().inflate(R.menu.activity_main, menu);
///return true;
super.onCreateOptionsMenu(menu);
Log.i(TAG,"创建菜单");
menu.add(0,1,1,"播放音频");
menu.add(0,2,2,"目录"); return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu){
super.onPrepareOptionsMenu(menu);
Log.i(TAG,"准备菜单");
menu.clear();
if(mMediaPlayer.isPlaying()){
menu.add(0,1,1,"暂停音频");
menu.add(0,2,2,"目录");
}else{
menu.add(0,1,1,"播放音频");
menu.add(0,2,2,"目录1");
} return true; }
@Override
public boolean onOptionsItemSelected(MenuItem item){
if(item.getItemId() == 1){ //选择“播放音频”
Log.i(TAG,"菜单选择");
try{
//Log.i(TAG,mMediaPlayer.isPlaying()+"");
if(mMediaPlayer.isPlaying()){
stop();
Log.i(TAG,"菜单选择");
}else
play(); }catch (Exception e){
Log.e(TAG,e.toString());
} }else if(item.getItemId() == 2){ //选择“目录” }
return false;
} @Override
protected void onDestroy(){
mMediaPlayer.release();
super.onDestroy();
Log.i(TAG,"OnDestroy");
} }

上述程序成功的关键是下面的一点:

(1)确保在进行音频调转seekTo(int)或者stop()之前,要确保之前已经进行过play(),不然会报错;

三、应用截图

【总结】关于MediaPlayer中的getCurrentPosition()和seekTo(int)的总结的更多相关文章

  1. Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52420803 前言:在上篇中,分析了MediaPl ...

  2. C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;

    ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口:       2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...

  3. MySQL中你肯定不知道的int隐情

    MySQL中定义id字段为int类型,但是你知道它内部是什么玩意吗? 1.如果定义int类型,但是不声明长度,系统默认为11个长度(这个大家都知道): 2.如果指定长度小于11,实际上系统还是默认为1 ...

  4. Java中List、integer[]、int[]之间的转化

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...

  5. 谈谈Java中整数类型(short int long)的存储方式

    在java中的整数类型有四种,分别是byte short in long,本文重点给大家介绍java中的整数类型(short int long),由于byte只是一个字节0或1,在此就不多说了,对ja ...

  6. Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&&finally中return问题

    在Java中返回值定义为int类型的 方法return 1:中返回的是Integer值,在返回的时候基本类型值1被封装为Integer类型. 定义一个Test类,在异常处理try中和finally中分 ...

  7. 在C\C++中char 、short 、int各占多少个字节

    在C\C++中char .short .int各占多少个字节 : #include <bits/stdc++.h> using namespace std; int main() { co ...

  8. java中整数的默认为int类型的一些问题

    thingking in java 读书感悟 作者 :淮左白衣 写于2018年4月8日17:51:44 关于整数的默认类型,以及会产生的一些小问题 涉及基本数据类型的重载 关于整数的默认类型,以及会产 ...

  9. java 基础--8 种基本数据类型:整型、浮点型、布尔型、字符型 整型中 byte、short、int、long 的取值范围 什么是浮点型?什么是单精度和双精度?为什么不能用浮点型表示金额?

     一.8种基本数据类型(4整,2浮,1符,1布): 整型:byte(最小的数据类型).short(短整型).int(整型).long(长整型): 浮点型:float(浮点型).double(双精度浮点 ...

随机推荐

  1. 决策树ID3算法--python实现

    参考: 统计学习方法>第五章决策树]   http://pan.baidu.com/s/1hrTscza 决策树的python实现     有完整程序     决策树(ID3.C4.5.CART ...

  2. code vs 1094 FBI树 2004年NOIP全国联赛普及组

    题目描述 Description 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树[1],它的结点类型 ...

  3. BZOJ.2246.[SDOI2011]迷宫探险(DP 记忆化搜索 概率)

    题目链接 求最大的存活概率,DP+记忆化. 用f[s][x][y][hp]表示在s状态,(x,y)点,血量为hp时的存活概率. s是个三进制数,记录每个陷阱无害/有害/未知. 转移时比较容易,主要是在 ...

  4. app分组

    将项目中中的urls.py复制到app当中 清空项目名称文件夹下的urls.py文件中的内容,并写入一下内容 from django.conf.urls import url,include urlp ...

  5. 你的java/c/c++程序崩溃了?揭秘段错误(Segmentation fault)(3)

    前言 接上两篇: 你的C/C++程序为什么无法运行?揭秘Segmentation fault (1) 你的C/C++程序为什么无法运行?揭秘Segmentation fault (2) 写到这里,越跟 ...

  6. Oracle 取整函数

    ceil(n):ceil英文含义是天花板,天花板在上面,所以意为向上取整,即大于或等于n的整数. floor(n):floor英文含义是地板,地板在下面,所以意为向下取整,即小于或等于n的整数.

  7. sagas

    http://mp.weixin.qq.com/s?src=3&timestamp=1503011877&ver=1&signature=cngvQj8-8qYsYcHR-5A ...

  8. Java怎样处理EXCEL的读取

    须要包:poi-3.5.jar.poi-ooxml-3.5.jar 实例: [java] view plaincopy public class ProcessExcel { private Work ...

  9. LPC43XX TQFP144 IO Pinout

  10. How to Set Up DTrace to Detect PHP Scripting Problems on Oracle Linux

    http://www.oracle.com/technetwork/articles/servers-storage-admin/php-dtrace-linux-2062229.html