【总结】关于MediaPlayer中的getCurrentPosition()和seekTo(int)的总结

         在使用音频时,需要用到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)的总结

 

你可能感兴趣的:(mediaplayer)