关于MediaPlayer中的getCurrentPosition()和seekTo(int)的总结
2016-05-04 23:45
826 查看
在使用音频时,需要用到MediaPlayer,除了一些基础的方法之外,比较难掌握的就是设计播放点的调转的地方,进过反复调试,我最终找到一个可以让getCurrentPosition()和seekTo(int)发挥作用的方法。
一、 布局代码如下:
[html] view
plain copy
<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代码
[java] view
plain copy
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(),不然会报错;
三、应用截图
一、 布局代码如下:
[html] view
plain copy
<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代码
[java] view
plain copy
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(),不然会报错;
三、应用截图
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories