一、从播放本地音乐Demo入手
通过直接new实例化一个MediaPlayer
private MediaPlayer mMediaPlayer;
mMediaPlayer = new MediaPlayer();
在对播放器进行初始配置前首相需要申请文件读写权限,先在清单文件中声明文件读写权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
再在代码中动态申请读写权限
//权限判断,如果没有权限就请求权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
initMediaPlayer();//初始化播放器 MediaPlayer
}
如果完全按这样去写出现错误,提示没有权限,一般是由于Scoped Storage导致的,可以在清单文件中加入下面一行解决
<application
...
android:requestLegacyExternalStorage="true"
...>
申请完成后再调用initMediaPlayer()进行初始配置,如果申请权限失败提示信息并退出Activity
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 1) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initMediaPlayer();
} else {
Toast.makeText(this, "拒绝权限,将无法使用程序。", Toast.LENGTH_LONG).show();
finish();
}
}
}
在initMediaPlayer()方法中主要配置需要播放的音乐文件路径,是否循环播放,并初始化播放器。
private void initMediaPlayer() {
try {
File file = new File(Environment.getExternalStorageDirectory(), "/music.mp3");
mMediaPlayer.setDataSource(file.getPath());//指定音频文件路径
mMediaPlayer.setLooping(false);//设置为循环播放
mMediaPlayer.prepare();//初始化播放器MediaPlayer
} catch (Exception e) {
e.printStackTrace();
}
}
通过三个按钮控制音乐的播放、暂停和停止
mBTPlay = findViewById(R.id.bt_play);
mBTPause = findViewById(R.id.bt_pause);
mBTStop = findViewById(R.id.bt_stop);
mBTPlay.setOnClickListener(v -> {
Log.i(TAG, "play");
//如果没在播放中,立刻开始播放。
if (!mMediaPlayer.isPlaying()) {
mMediaPlayer.start();
}
});
mBTPause.setOnClickListener(v -> {
Log.i(TAG, "pause");
//如果在播放中,立刻暂停。
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
}
});
mBTStop.setOnClickListener(v -> {
Log.i(TAG, "stop");
//如果在播放中,立刻停止。
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.reset();
initMediaPlayer();//初始化播放器 MediaPlayer
}
});
在退出Activity之前需要对MediaPlayer的资源进行释放
@Override
protected void onDestroy() {
super.onDestroy();
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
}
}
二、MediaPlayer播放器
//TODO:介绍MediaPlayer播放器,播放功能,使用场景
三、附录(完整代码)
activity_play_music.xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/bt_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/play" />
<Button
android:id="@+id/bt_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pause" />
<Button
android:id="@+id/bt_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/stop" />
</LinearLayout>
PlayerMusicActivity.java文件
public class PlayMusicActivity extends Activity {
private final String TAG = "PlayMusicActivity";
private MediaPlayer mMediaPlayer;
private Button mBTPlay;
private Button mBTPause;
private Button mBTStop;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_music);
mMediaPlayer = new MediaPlayer();
//权限判断,如果没有权限就请求权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
initMediaPlayer();//初始化播放器 MediaPlayer
}
mBTPlay = findViewById(R.id.bt_play);
mBTPause = findViewById(R.id.bt_pause);
mBTStop = findViewById(R.id.bt_stop);
mBTPlay.setOnClickListener(v -> {
Log.i(TAG, "play");
//如果没在播放中,立刻开始播放。
if (!mMediaPlayer.isPlaying()) {
mMediaPlayer.start();
}
});
mBTPause.setOnClickListener(v -> {
Log.i(TAG, "pause");
//如果在播放中,立刻暂停。
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
}
});
mBTStop.setOnClickListener(v -> {
Log.i(TAG, "stop");
//如果在播放中,立刻停止。
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.reset();
initMediaPlayer();//初始化播放器 MediaPlayer
}
});
}
private void initMediaPlayer() {
try {
File file = new File(Environment.getExternalStorageDirectory(), "/music.mp3");
mMediaPlayer.setDataSource(file.getPath());//指定音频文件路径
mMediaPlayer.setLooping(false);//设置为循环播放
mMediaPlayer.prepare();//初始化播放器MediaPlayer
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 1) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initMediaPlayer();
} else {
Toast.makeText(this, "拒绝权限,将无法使用程序。", Toast.LENGTH_LONG).show();
finish();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
}
}
}