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

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

(0)

相关推荐

  • Android App调用MediaRecorder实现录音功能的实例

    MediaRecorder Android的MediaRecorder包含了Audio和video的记录功能,在Android的界面上,Music和Video两个应用程序都是调用MediaRecorder实现的. MediaRecorder在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaRecorder程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制. 以开源的Android为例MediaRecorder的

  • Android使用MediaRecorder实现录音及播放

    现在项目中有使用到音视频相关技术,在参考了网上各种大牛的资料及根据自己项目实际情况(兼容安卓6.0以上版本动态权限管理等),把声音录制及播放相关代码做个记录. public class MediaRecorderActivity extends BaseActivity { private Button start_tv; private ListView listView; //线程操作 private ExecutorService mExecutorService; //录音API pri

  • Android录音时获取分贝值的方法代码实例

    参考文章Android中实时获取音量分贝值详解:http://www.jb51.net/article/64806.htm public class MediaRecorderDemo { private final String TAG = "MediaRecord"; private MediaRecorder mMediaRecorder; public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*1

  • Android音频录制MediaRecorder之简易的录音软件实现代码

    使用MediaRecorder的步骤:1.创建MediaRecorder对象2.调用MediRecorder对象的setAudioSource()方法设置声音的来源,一般传入MediaRecorder.MIC3.调用MediaRecorder对象的setOutputFormat()设置所录制的音频文件的格式4.调用MediaRecorder对象的setAudioRncoder().setAudioEncodingBitRate(int bitRate).setAudioSamlingRate(i

  • Android编程检测手机录音权限是否打开的方法

    本文实例讲述了Android编程检测手机录音权限是否打开的方法.分享给大家供大家参考,具体如下: 6.0之前的权限检测只是检测到是否在清单文件中注册 Boolean flag = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.RECORD_AUDIO", "包名")); Boolean flag = PermissionChecker.checkSelfPer

  • Android录音--AudioRecord、MediaRecorder的使用

    Android提供了两个API用于实现录音功能:android.media.AudioRecord.android.media.MediaRecorder. 网上有很多谈论这两个类的资料.现在大致总结下: 1.AudioRecord 主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫.语音) 优点:语音的实时处理,可以用代码实现各种音频的封装 缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码

  • Android实现语音播放与录音功能

    本文实例为大家分享了Android实现语音播放与录音的具体代码,供大家参考,具体内容如下 项目用到的技术点和亮点 语音录音 (单个和列表) 语音播放(单个和列表) 语音录音封装 语音播放器封装 语音列表顺序播放 语音列表单个播放 复用问题处理 因为安装原生录音不能录mp3格式文件 而mp3格式是安卓和ios公用的,所以我们需要的是能直接录取mp3文件或者录完的格式转成mp3格式 下面添加这个库 能直接录mp3文件,我觉得是最方便的 compile 'com.czt.mp3recorder:lib

  • Android应用开发:电话监听和录音代码示例

    在oncreate 中执行: 复制代码 代码如下: public void onCreate() {  super.onCreate();  Log.i("TAG", "服务启动了"); // 对电话的来电状态进行监听  TelephonyManager telManager = (TelephonyManager) this    .getSystemService(Context.TELEPHONY_SERVICE);  // 注册一个监听器对电话状态进行监听 

  • android语音即时通讯之录音、播放功能实现代码

    在android中,实现录音与语音播放的功能算是比较简单的,但是作为参考,还是很有必要将语音相关的知识做一个简要的记录. 首先,在android中,支持录音支持两种方式.主要包括:字节流模式和文件流模式.用文件流模式进行录音操作比较简单,而且相对来说,因为其封装性比较好,录制下的文件也会比较小.但是相对于文件流模式,就没有字节流模式那么灵活,但是想要用好字节流模式还是需要下一点功夫的. 下面开始介绍文件流模式的语音操作: 文件流模式 我们来看录音部分的实现,首先我们实现开始录音的部分: 在正式编

  • Android开发四大组件之实现电话拦截和电话录音

    一.问题描述 使用BordercastReceiver和Service组件实现下述功能: 1.当手机处于来电状态,启动监听服务,对来电进行监听录音. 2.设置电话黑名单,当来电是黑名单电话,则直接挂断. 当拨打电话或电话状态发生改变时,系统就会发出有序广播,因此我们可以使用BordercastReceiver接受广播,因BordercastReceiver执行时间短不能执行耗时任务也不能使用子线程,因此我们应启动一个Service来监听电话并进行处理 二.加入AIDL文件 Android没有对外

  • Android 实现电话来去自动录音的功能

    我们在使用Android手机打电话时,有时可能会需要对来去电通话自动录音,本文就详细讲解实现Android来去电通话自动录音的方法,大家按照文中的方法编写程序就可以完成此功能. 来去电自动录音的关键在于如何监听手机电话状态的转变: 1)来电的状态的转换如下(红色标记是我们要用到的状态) 空闲(IDEL)--> 响铃(RINGING)--> 接听(ACTIVE)--> 挂断(经历DISCONNECTING--DISCONNECTED)--> 空闲(IDEL) 或者  空闲(IDEL)

  • Android简单的利用MediaRecorder进行录音的实例代码

    复制代码 代码如下: package com.ppmeet; import java.io.IOException; import android.app.Activity;  import android.graphics.PixelFormat;  import android.media.MediaRecorder;  import android.os.Bundle;  import android.view.View;  import android.view.View.OnClick

  • Android录音应用实例教程

    本文以实例形式较为详细的展示了Android录音的实现方法,分享给大家供大家参考之用.具体方法如下: 首先是xml布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" andr

随机推荐