1 MediaPlayer生命周期
2 MediaPlayer常用方法
MediaPlayer执行流程:
- 创建MediaPlayer
MediaPlayer mediaPlayer = new MediaPlayer();
或
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test); // 使用该方法不需要再setDataSource()和prepare()
- 设置数据源
mediaPlayer.setDataSource(filePath);
- 进入准备状态
mediaPlayer.prepare();
- 开始播放
mediaPlayer.start();
- 暂停/停止播放
mediaPlayer.pause();
mediaPlayer.stop();
- 重置MediaPlayer
mediaPlayer.reset():
- 释放MediaPlayer
mediaPlayer.release();
3 MediaPlayer的使用
<?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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_start"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开启" />
<Button
android:id="@+id/btn_pause"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="暂停" />
<Button
android:id="@+id/btn_stop"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止" />
</LinearLayout>
<SeekBar
android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:max="0"
android:progress="0"
android:secondaryProgress="0" />
</LinearLayout>
/**
* 1、MediaPlayer创建的两种方式
* (1)MediaPlayer mediaPlayer = new MediaPlayer();
* (2)MediaPlayer mediaPlayer = MediaPlayer.create(context, source);
* 使用第二种方法创建MediaPlayer不用再调用setDataSource()设置数据源
*
* 2、设置数据源的三种方式
* (1)在resource资源获取数据源:
* MediaPlayer.create(this, R.raw.test);
* (2)在sd卡或文件路径获取数据源:
* MediaPlayer.setDataSource("/sdcard/test.mp3");
* (3)网络数据源:
* MediaPlayer.setDataSource("http://www.test.com/test.mp3");
*
* 3、MediaPlayer的setDataSource()一共有四个方法:
* [1]setDataSource(String path)
* [2]setDataSource(FileDescriptor fd)
* [3]setDataSource(Context context, Uri uri)
* [4]setDataSource(FileDescriptor fd, long offset, long length)
*
* 其中,使用FileDescriptor时,需要将文件放到与res目录平级的assets目录,通过以下方式访问:
* AssetFileDescriptor fd = getAssets().openFd("test.mp3");
* MediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
*/
public class MediaPlayerActivity extends AppCompatActivity {
private SeekBar mSeekBar;
private MediaPlayer mMediaPlayer;
private static Handler sHandler = new Handler();
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
sHandler.postDelayed(this, 1000);
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_player);
initViews();
initMediaPlayer();
initMediaData();
// 开启
findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mMediaPlayer != null) {
if (mMediaPlayer.isPlaying()) {
return;
}
} else {
initMediaPlayer();
}
mMediaPlayer.start();
sHandler.postDelayed(mRunnable, 1000);
}
});
// 暂停
findViewById(R.id.btn_pause).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
}
}
});
// 停止
findViewById(R.id.btn_stop).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer = null;
}
}
});
// 播放进度监听
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mMediaPlayer != null) {
mMediaPlayer.seekTo(mSeekBar.getProgress());
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
private void initViews() {
mSeekBar = findViewById(R.id.seekbar);
}
private void initMediaPlayer() {
// 播放会有卡顿,不流畅
try {
AssetFileDescriptor afd = getAssets().openFd("heavy.mp3");
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mMediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
// res/raw
// mMediaPlayer = MediaPlayer.create(this, R.raw.heavy);
}
private void initMediaData() {
mSeekBar.setMax(mMediaPlayer.getDuration());
}
@Override
protected void onDestroy() {
super.onDestroy();
sHandler.removeCallbacks(mRunnable);
// 释放资源
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
}
}
}