Android录音机占用录音功能,其他app无法正常使用录音功能 您所在的位置:网站首页 录音权限被系统或者其他软件禁止 Android录音机占用录音功能,其他app无法正常使用录音功能

Android录音机占用录音功能,其他app无法正常使用录音功能

2023-10-28 10:58| 来源: 网络整理| 查看: 265

项目app录音问题:手机系统录音机在录音过程中退到后台录音,此时打开项目app开始录像,因为录音功能被系统录音机占用,导致项目app不能正常使用录音功能,录制下来的视频文件不能正常播放。检测出现问题的原因,可能有如下三种:

第一种,就是start的时候会报异常,这种我们把它包在try catch中即可捕获到异常。在此不多累述。 

第二种,就是不报异常,正常执行,这种情况我们没办法去判断系统是否禁止了我们的app的录音权限,所以我在此分析的是部分机型在被禁止后不报异常,我们可以去检测音频振幅大小,部分机型的音频振幅值在用MediaRecorder时是0,在用AudioRecord时值小于0,所以这种情况我们可以通过其振幅值判断, AudioRecord判断方法:

int readSize = 0; /*--实时录音写数据--*/ readSize = audioRecord.read(buffer,0,minBufferSize); if (readSize < 0) { //录音出现异常 }

该方法能检测到大部分机型录音被禁止,或其他异常状况。

第三种,MediaRecorder判断方法: MediaRecorder就不怎么好检测了,因为MediaRecorder在用方法getMaxAmplitude()时取得振幅值是0-32767,也就是即使不禁止录音权限,振幅值依然会有0值出现,所以不能简单地判断振幅值是否为0,我在此的检测方法是根据前1s的录音,取10次振幅值进行判断: 先声明三个变量:

private int vocAuthority[] = new int[10]; private int vocNum = 0; private boolean check = true;

然后写个方法:

int vocLevel = mRecorder.getMaxAmplitude(); if (check) { if (vocNum >= 10) { Set set = new HashSet(); for (int i = 0; i < vocNum; i++) { set.add(vocAuthority[i]); } if (set.size() == 1) { if (handler != null) handler.sendEmptyMessage(MSG_ERROR_AUDIO_RECORD); vocNum = 0; vocAuthority = null; vocAuthority = new int[10]; }else{ check = false; } } else { vocAuthority[vocNum] = vocLevel; vocNum++; } } 该方法每100ms执行一次,1s十次后判断vocAuthority中的值是否全部一样,也就是说是否全部为零,如果全部一样那么录音肯定有问题。(我试了如果在非常安静的情况下前十次的取值也不是都为零,大家可以试试) 

第三种,还有部分机型不仅不报异常,而且在录音时会制造音频振幅的假数据,也就是虽然录音被禁止,系统依然会把音频振幅反馈给你,像华为p7就是这样,这种情况肯定不能再去检测音频振幅了,只能另辟蹊径,通过我的观察发现在用MediaRecorder录音时,如果被禁止那么本地不会出现录音文件,所以我们可以以此为突破口,检测本地是否有生成的录音文件来判断系统是否禁止了我们的录音权限。

AudioRecord我没试,大家可以试试。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有