MediaPlayer的使用
简介:Android应用程序中的音频和视频的播放通常有MediaPlayer类进行处理。使用MediaPlayer,能播放存储在应用程序资源、本地文件、ContentProvider、网络URL的流式传输中的媒体。
MediaPlaye对音频和视频文件以及数据流的管理是作为一个状态机来处理的。状态机详细资料,点击这里跳转简单来说,就是:
- 对将要播放媒体的MediaPlayer进行初始化;
- 使MediaPlayer进入准备状态;
- 开始播放;
- 在播放完成之前暂停或停止播放;
- 播放完成。
一、播放音频
以下是MediaPlayer中一些常用的方法:
示例:播放assetes文件夹下的音频资源,可以暂停/播放、随机切换、与SeekBar控件建立关联。
效果:
1.1 布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:background="#1E95D6"
android:gravity="center"
android:padding="10dp"
android:text="音频播放器"
android:textColor="#FFFFFF"
android:textSize="20sp" />
<TextView
android:id="@+id/audio_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="音频文件名"
android:textSize="16sp"
android:gravity="center"/>
<TextView
android:id="@+id/audio_singer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="歌手"
android:padding="10dp"
android:textSize="14sp"
android:gravity="center"/>
<LinearLayout
android:id="@+id/lin_Media"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/time_current"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="0:0" />
<SeekBar
android:id="@+id/seekBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="5" />
<TextView
android:id="@+id/time_sum"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="0:0" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/play"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="1"
android:text="暂停" />
<Button
android:id="@+id/random"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="1"
android:text="随机切换" />
</LinearLayout>
</LinearLayout>
2.2 资源文件
2.3 代码
public class MediaMusicActivity extends Activity {
@BindView(R.id.audio_title)
TextView audioTitle;
@BindView(R.id.audio_singer)
TextView audioSinger;
@BindView(R.id.time_current)
TextView timeCurrent;
@BindView(R.id.seekBar)
SeekBar seekBar;
@BindView(R.id.time_sum)
TextView timeSum;
@BindView(R.id.play)
Button btnPlay;
private Context mContext = MediaMusicActivity.this;
private static MediaPlayer mMusicMediaPlayer;
private Timer mTimer = new Timer();
private int toProgress;
private int currentMusic;
private String[] arrMusicName = new String[]{"Stay With Me(中文版)", " Numb", "Apologize"};
private String[] arrMusicSinger = new String[]{"Jason Chen", "Linkin Park", "Kris Allen"};
private String[] arrMusicUri = new String[]{"_001.mp3", "_002.mp3", "_003.mp3"};
private final static int UPDATE = 01001;//更新
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case UPDATE:
timeCurrent.setText(getTime(mMusicMediaPlayer.getCurrentPosition()));
seekBar.setProgress(mMusicMediaPlayer.getCurrentPosition());
break;
}
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_music);
ButterKnife.bind(this);
currentMusic = randomGenerator(0, arrMusicUri.length);
initMediaPlayer(mContext);
mTimer.schedule(new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(UPDATE);
}
},0,1000);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
timeCurrent.setText(getTime(progress));
toProgress = progress;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mMusicMediaPlayer.seekTo(toProgress);
mMusicMediaPlayer.start();
}
});
}
@OnClick({R.id.play, R.id.random})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.play:
if(mMusicMediaPlayer.isPlaying()){
mMusicMediaPlayer.pause();
btnPlay.setText("播放");
}else {
mMusicMediaPlayer.start();
btnPlay.setText("暂停");
}
break;
case R.id.random:
initMediaPlayer(mContext);
break;
}
}
/**
* 创建MediaPlayer对象,并设置数据源
*/
private void initMediaPlayer(Context context) {
int intRandom = randomMusic();
if (mMusicMediaPlayer == null) {
mMusicMediaPlayer = new MediaPlayer();
}
mMusicMediaPlayer.reset(); // 强制重置(针对非第一次播放)
AssetManager assetManager = context.getAssets();
try {
AssetFileDescriptor fileDescriptor = assetManager.openFd(arrMusicUri[intRandom]);
mMusicMediaPlayer
.setDataSource(fileDescriptor.getFileDescriptor(),
fileDescriptor.getStartOffset(),
fileDescriptor.getLength());
mMusicMediaPlayer.prepare();
mMusicMediaPlayer.start();//播放
updateViews(intRandom);//更新UI
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 随机切换(生成一个与当前值不同的随机数)
* @return
*/
private int randomMusic(){
int intRandom = randomGenerator(0, arrMusicUri.length);
while (intRandom == currentMusic){
intRandom = randomGenerator(0, arrMusicUri.length);
}
return intRandom;
}
/**
* 重置播放器后更新UI
* @param position
*/
private void updateViews(int position) {
audioTitle.setText(arrMusicName[position]);
audioSinger.setText(arrMusicSinger[position]);
timeSum.setText(getTime(mMusicMediaPlayer.getDuration()));
seekBar.setMax(mMusicMediaPlayer.getDuration());
seekBar.setProgress(0);
btnPlay.setText("暂停");
currentMusic = position;
}
/**
* 生成指定范围的随机数[min,max)
*
* @param min
* @param max
* @return
*/
private int randomGenerator(int min, int max) {
return new Random().nextInt(max) % (max - min + 1) + min;
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mMusicMediaPlayer != null) {
mMusicMediaPlayer.stop();
}
if(mTimer != null){
mTimer.cancel();
}
}
/**
* 转化时长
* @param duration
* @return
*/
private String getTime(int duration) {
int intMinute = (duration / 1000) / 60;
int intSecond = (duration / 1000) % 60;
String strMinute = (intMinute < 10 ? "0" + intMinute : "" + intMinute);
String strSecond = (intSecond < 10 ? "0" + intSecond : "" + intSecond);
return strMinute + ":" + strSecond;
}
}