首先,我们需要在手机的SD卡目录下存放一首音频,手机默认的根目录是/storage/emulated/0,我们可以按照下面代码里的方法,得到这个根目录,也可以自己写,
我们在布局文件当中只布置三个按钮,分别用来开始播放(start),暂停(pause),结束(end)这里不做详细的说明。
在AndroidManifest.xml文件增加如下的两句权限获取。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.dede.mypplication">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
.........
</application>
动态权限获取
第一步先要判断用户是否已经授予过权限,借助的是ContextCompat.checkSelfPermission()方法,他需要接受两个参数,第一个是上下文对象,第二个是具体的权限名,我们使用方法的返回值和PackageManager.PERMISSION_GRANTED作比较,相等说明已经授予权限,不等表示用户没有授权。如果授权的话,没什么说的,要是没有授权,就需要调用 ActivityCompat.requestPermissions()方法来向用户申请授权,它接受三个参数,第一个参数是Activity的实例,第二个是一个String数组,我们把要申请的权限名称放在数组中即可,第三个参数是请求码,只是是唯一值即可。
在调用完requestPermissions()方法后,系统会弹出一个对话框,然后用户可以选择同意或者拒绝,不论怎样,都会回调重写的onRequestPermissionsResult()方法,而授权的结果会封装在granreaults参数当,我们只需要判断最后的授权结果就可以。
MediaPlayer的常用方法
setDataSource() 设置播放音频的文件位置
prepare() 再开始播放之前,调用这个函数完成准备工作
start() 开始或继续播放音频
pause() 暂停播放
reset() 将视频从头开始
seekTo() 从指定位置播放
stop() 停止播放,调用这个函数,MediaPlayer无法在播放音频
release() 释放掉MediaPlayer相关的资源
isPlaying() 判断当前是否在播放
getDuration() 获取载入视频文件的时长
流程:
创建一个MediaPlayer对象,调用setDataSource()指定路径,调用prepare()完成准备,start()开始播放。
源码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
MediaPlayer mediaPlayer=new MediaPlayer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button start = findViewById(R.id.start);
Button pause = findViewById(R.id.pause);
Button end = findViewById(R.id.end);
start.setOnClickListener(this);
pause.setOnClickListener(this);
end.setOnClickListener(this);
//为app动态获取访问SD卡的权限
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
else
{
initMediaPlayer();
}
}
//初始化MediaPlayer
private void initMediaPlayer() {
//Environment.getExternalStorageDirectory()也就是storage/emulated/0的手机根目录,
//具体的剩余子目录写在第二个参数,音频文件要有后缀,例如.mp3
File file=new File(Environment.getExternalStorageDirectory(),"test.mp3");
try {
mediaPlayer.setDataSource(file.getPath());
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
//权限获取函数的回调函数
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch(requestCode){
case 1:
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED)
{initMediaPlayer();}
else{
finish();
Toast.makeText(this,"denied!",Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.start:
if(!mediaPlayer.isPlaying())
mediaPlayer.start();
break;
case R.id.pause:
if(mediaPlayer.isPlaying())
mediaPlayer.pause();
break;
case R.id.end:
if(mediaPlayer.isPlaying())
mediaPlayer.reset();
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mediaPlayer!=null)
{
mediaPlayer.stop();
mediaPlayer.release();
}
}
}