Android开发录音和播放音频的步骤(动态获取权限)

步骤:

配置权限:
manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.work.mediaplay">
uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
代码步骤:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btn_start, btn_stop;
    private ListView lv_content;
    private File sdcardfile = null;
    private String[] files;
    private MediaRecorder recorder=null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        getSDCardFile();
        getFileList();

    }

    /**
     * ① 实例化控件
     */
    private void initView() {
        btn_start = (Button) findViewById(R.id.btn_stat);
        btn_stop = (Button) findViewById(R.id.btn_stop);
        lv_content = (ListView) findViewById(R.id.lv_content);
        //⑤给按钮添加监听事件
        btn_start.setOnClickListener(this);
        btn_stop.setOnClickListener(this);
        //设置起始状态开始按钮可用,停止按钮不可用
        btn_start.setEnabled(true);
        btn_stop.setEnabled(false);

    }

    /**
     * ②获取内存卡中文件的方法
     */
    private void getSDCardFile() {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//内存卡存在
                    sdcardfile=Environment.getExternalStorageDirectory();//获取目录文件
        }else {
            Toast.makeText(this,"未找到内存卡",Toast.LENGTH_SHORT).show();
        }
    }
    /**
     * ③获取文件列表(listView中的数据源)
     * 返回指定文件类型的文件名的集合作为数据源
     */
    private void getFileList(){
        if(sdcardfile!=null){
            files=sdcardfile.list(new MyFilter());
            lv_content.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,files));
            //⑥给ListView中的元素添加点击播放事件
            lv_content.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    //⑩定义播放音频的方法
                    play(files[position]);
                }
            });
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_stat:
                //⑧申请录制音频的动态权限
                if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.RECORD_AUDIO)
                        != PackageManager.PERMISSION_GRANTED){
                    ActivityCompat.requestPermissions(this,new String[]{
                        android.Manifest.permission.RECORD_AUDIO},1);
                }else {
                    startRecord();
                }
                break;
            case R.id.btn_stop:
                stopRcecord();
                break;
        }

    }

    /**
     * ④定义一个文件过滤器MyFilter的内部类,实现FilenameFilter接口
     * 重写里边accept方法
     */
    class MyFilter implements FilenameFilter{

        @Override
        public boolean accept(File pathname,String fileName) {
            return fileName.endsWith(".amr");
        }
    }
    /**
     * ⑦给两个按钮定义开始和暂停的方法
     *
     */
    private void startRecord(){
        if(recorder==null){
            recorder=new MediaRecorder();
        }
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置音频源为手机麦克风
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置输出格式3gp
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码为amr格式
        //获取内存卡的根目录,创建临时文件
        try {
            File file=File.createTempFile("录音_",".amr",sdcardfile);
            recorder.setOutputFile(file.getAbsolutePath());//设置文件输出路径
            //准备和启动录制音频
            recorder.prepare();
            recorder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //启动后交换两个按钮的可用状态
        btn_start.setEnabled(false);
        btn_stop.setEnabled(true);

    }
    private void stopRcecord(){
        if(recorder!=null){
            recorder.stop();
            recorder.release();
            recorder=null;
        }
        btn_start.setEnabled(true);
        btn_stop.setEnabled(false);
        //刷新列表数据
        getFileList();

    }
    /**
     * ⑨重写onRequestPermissionsResult方法
     * 获取动态权限请求的结果,再开启录制音频
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode==1&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
            startRecord();
        }else {
            Toast.makeText(this,"用户拒绝了权限",Toast.LENGTH_SHORT).show();
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
    /**
     * ⑩定义播放音频的方法
     */
    private void  play(String fileName){
        Intent intent=new Intent(Intent.ACTION_VIEW);
        //播放音频需要uri,从文件中获取,文件中需要路径
        Uri uri=Uri.fromFile(new File(sdcardfile.getAbsoluteFile()+File.separator+fileName));
        //设置播放数据和类型
        intent.setDataAndType(uri,"audio/*");
        startActivity(intent);
    }
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值