AndroidStudio音频播放器MediaPlayer(动态权限获取)

首先,我们需要在手机的SD卡目录下存放一首音频,手机默认的根目录是/storage/emulated/0,我们可以按照下面代码里的方法,得到这个根目录,也可以自己写,
我们在布局文件当中只布置三个按钮,分别用来开始播放(start),暂停(pause),结束(end)这里不做详细的说明。
在AndroidManifest.xml文件增加如下的两句权限获取。



    
    
    

动态权限获取
第一步先要判断用户是否已经授予过权限,借助的是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();
        }
    }
}

你可能感兴趣的