先来说几个常用状态:
-
MediaPlayer.OnCompletionListener 监听MediaPlayer播放完成时的状态,
回调onCompletion(MediaPlayer mp) -
MediaPlayer.OnPreparedListener 监听MediaPlayer准备完成时的状态,
回调onPrepared(MediaPlayer mp)
-
MediaPlayer.OnErrorListener 监听MediaPlayer播放发生错误时的状态,
回调onError(MediaPlayer mp, int what, int extra)
-
MediaPlayer.OnBufferingUpdateListener 监听MediaPlayer缓冲完成时的状态, 回调onBufferingUpdate(MediaPlayer mp, int percent)
贴上一段码表示状态
package com.example.day604;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.IOException;
/**
* 通过http获得mp3文件播放,
*该音频文件存在于服务器的位置 http://www.mobvcasting.com/android/audio/goodmorinigandroid.mp3
*/
public class MainActivity extends AppCompatActivity implements MediaPlayer.OnCompletionListener,
View.OnClickListener, MediaPlayer.OnPreparedListener,
MediaPlayer.OnErrorListener,MediaPlayer.OnBufferingUpdateListener{
private MediaPlayer mediaPlayer;
private TextView bufferText,statusText;
private Button start,stop;
private String url="http://www.mobvcasting.com/android/audio/goodmorinigandroid.mp3";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start=(Button)findViewById(R.id.start);
stop=(Button)findViewById(R.id.stop);
bufferText=(TextView)findViewById(R.id.bufferText);
statusText=(TextView)findViewById(R.id.statusText);
statusText.setText("onCreate");
//这种无参构造的方式和以前的有参调用不同需要几个步骤
mediaPlayer=new MediaPlayer();
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnErrorListener(this);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnBufferingUpdateListener(this);
statusText.setText("MediaPalyer created");
try {
mediaPlayer.setDataSource(url);
statusText.setText("setDataSource done");
statusText.setText("calling prepareAsync");
// mediaPlayer.prepare();//运行prepare()播放器会填充一个缓冲区,即使网速慢也能平稳的播放 但这里的prepare()会造成阻塞
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
start.setOnClickListener(this);
stop.setOnClickListener(this);
start.setEnabled(false);
stop.setEnabled(false);
}
@Override
public void onClick(View v) {
if (v==start) {
mediaPlayer.start();
statusText.setText("start called");
start.setEnabled(false);
stop.setEnabled(true);
} else if (v==stop) {
mediaPlayer.pause();
statusText.setText("pause called");
start.setEnabled(true);
}
}
/**
* @param mp
* Mediaplayer播放完成时回调
*/
@Override
public void onCompletion(MediaPlayer mp) {
statusText.setText("onComplete called");
start.setEnabled(false);
stop.setEnabled(false);
}
/**
* @param mp
* 当完成prepareAsync()状态时回调,表明音频准备播放
*/
@Override
public void onPrepared(MediaPlayer mp) {
statusText.setText("prepared called");
start.setEnabled(true);
}
/**
* @param mp
* @param what
* @param extra
* @return
* 当MediaPalyer发生错误后调用
*/
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
statusText.setText("onError called");
switch (what) {
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
statusText.setText("MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK"+extra);
Log.v("Error:","MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:"+extra);
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
statusText.setText("MEDIA_ERROR_SERVER_DIED:"+extra);
Log.v("Error","MEDIA_ERROR_SERVER_DIED:"+extra);
break;
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
statusText.setText("MEDIA_ERROR_UNKNOWN:"+extra);
Log.v("Error","MEDIA_ERROR_UNKNOWN:"+extra);
break;
}
return false;
}
/**
* @param mp
* @param percent
* MediaPlayer正在缓冲时调用
*/
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
bufferText.setText(""+percent+"%");
}
}