美文网首页
麦克风通道被占用问题处理

麦克风通道被占用问题处理

作者: EdwardWinner | 来源:发表于2019-02-20 10:35 被阅读2次

录音代码写完之后,开始测试
测试录音步骤:

步骤 结果 原因
第一次启动APP 获取权限 第一次录音失败 crash之后,录音通道被释放
获取权限(定位?录音权限 第二次录音正常

crash相关信息:发现第一次调用MediaRecorder.start(),出现IllegalStateException。
具体Log如下:

2451548054587_.pic_hd.png

以上信息不能准确的发现出现问题的根本原因。

排除问题:
1.权限是否打开

AndroidManifest.xml 定义权限
checkPerMission 

2.是否正常初始化:

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setOutputFile(mFilePath);
mMediaRecorder.setMaxDuration(MAX_LENGTH);
mMediaRecorder.prepare();
mMediaRecorder.start();

3.资源是否正常释放:

mMediaRecorder.setOnErrorListener(null);
mMediaRecorder.setOnInfoListener(null);
mMediaRecorder.setPreviewDisplay(null);
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;

4.打印更多的log,比如start failed:-xx类型的log?

01-21 16:08:28.675 E/MediaRecorder( 4722): start failed: -38

查阅资源发现,-38代表麦克风通道被占用。
通道占用判断方法

private boolean validateMicAvailability(){
    Boolean available = true;
    AudioRecord recorder =
            new AudioRecord(MediaRecorder.AudioSource.MIC, 44100,
                    AudioFormat.CHANNEL_IN_MONO,
                    AudioFormat.ENCODING_DEFAULT, 44100);
    try{
        if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED ){
            available = false;
        }

        recorder.startRecording();
        if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING){
            recorder.stop();
            available = false;
        }
        recorder.stop();
    } finally{
        recorder.release();
        recorder = null;
    }
    return available;
}

返回true就是没有被占用。
返回false就是被占用。
调用完validateMicAvailability方法之后,Micro通道已经被释放,其他模块即可以使用麦克风。

根本原因:
1.由于项目中还引用了科大讯飞离线版语音模块,语音模块初始化成功之后,离线唤醒功能开启之后,默认打开语音权限,即占用语音通道。所以导致录音功能无法正常使用。
2.如果项目既想录音功能存在,又想使用语音模块,那么同一时刻只能使用一个。比如当需要录音时,主动关闭语音模块,当录音完成之后,主动初始化语音模块。

相关文章

  • 麦克风通道被占用问题处理

    录音代码写完之后,开始测试测试录音步骤: crash相关信息:发现第一次调用MediaRecorder.start...

  • 【产品分析】从小米AI音箱看智能音箱

    1.硬科技+声学算法: Echo智能音箱架构:麦克风阵列板、主板、功放分离(模拟麦克风导致A/D等占用空间,不便简...

  • linux处理某端口被占用问题

    处理某端口被占用问题 已知被占用端口为8887 1.切换到root用户,这样可以看到所有占用该端口的所有用户进程 ...

  • navicat ssh通道受限问题处理

    navicat 链接数据库 使用navicat 的ssh通道连接数据库回遇到权限问题错误代码如下: 解决方案如下:...

  • navicat ssh通道受限问题处理

    navicat 链接数据库 使用navicat 的ssh通道连接数据库回遇到权限问题错误代码如下: 解决方案如下...

  • 谁动了你的5037端口

    许多ADB奇怪的问题,都是源于5037端口被其他程序占用了,经常还是被各种XXX助手软件占用了~ 怎么找到占用了5...

  • 23.RNN模型: 时间序列预测

    问题描述基于历史的20个通道,预测3个通道未来的值。 流程1.时间序列数据预处理:利用pandas.dataFra...

  • Sublime Text 全局搜索Ctrl+Shift+F快捷键

    代码格式化CTRL + SHIFT + F被输入法占用 如依然存在此问题,检查是否被搜狗输入法占用

  • 生命通道,岂容私自占用!

    7月2日拂晓,在广东湛江市遂溪县遂城镇友谊新村,发生了一起悲剧,当地一幢五层民居住宅楼突发着火,救援人员搜救出来的...

  • runLoop自我总结

    runLoop 一、概述 接受消息->等待->处理,在没有处理消息时休眠以避免资源占用、在有消息到来时立刻被唤醒。...

网友评论

      本文标题:麦克风通道被占用问题处理

      本文链接:https://www.haomeiwen.com/subject/kppcyqtx.html