当前位置: 移动技术网 > IT编程>移动开发>Android > 详解Android开发录音和播放音频的步骤(动态获取权限)

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

2019年09月09日  | 移动技术网IT编程  | 我要评论

依黛兰,宅急送网点,甘智和

步骤:

配置权限:

<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);
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网