(一)、Android录音权限被禁解决方案
大家在做Android录音的时候会碰到权限被禁止的情况出现,当用户禁止了录音权限的时候我们为了界面友好会提示用户,但是安卓机型很多,有些机型在录音start的时候如果被禁会报异常,当然这种情况很好解决,但是有些机型会正常执行,在此我们分析一下我所遇到的情况。
被禁情况分析
1,第一种,就是start的时候会报异常,这种我们把它包在try catch中即可捕获到异常。在此不多累述。
2,第二种,就是不报异常,正常执行,这种情况我们没办法去判断系统是否禁止了我们的app的录音权限。
所以我在此分析的是部分机型在被禁止后不报异常,我们可以去检测音频振幅大小,部分机型的音频振幅值在用MediaRecorder时是0,在用AudioRecord时值小于0,所以这种情况我们可以通过其振幅值判断:
(1)AudioRecord判断方法:
int readSize = 0;
/*--实时录音写数据--*/
readSize = audioRecord.read(buffer,0,minBufferSize);
if (readSize < 0) {
//录音出现异常
}
该方法能检测到大部分机型录音被禁止,或其他异常状况。
(2)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<Integer> set = new HashSet<Integer>();
for (int i = 0; i < vocNum; i++) {
set.add(vocAuthority[i]);
}
if (set.size() == 1) {
if (handler != null)
handler.sendEmptyMessage(MSG_ERROR_AUDIO_RECORD);
}else{
check = false;
}
} else {
vocAuthority[vocNum] = vocLevel;
vocNum++;
}
}
该方法每100ms执行一次,1s十次后判断vocAuthority中的值是否全部一样,也就是说是否全部为零,如果全部一样那么录音肯定有问题。(我试了如果在非常安静的情况下前十次的取值也不是都为零,大家可以试试)
3,第三种,还有部分机型不仅不报异常,而且在录音时会制造音频振幅的假数据,也就是虽然录音被禁止,系统依然会把音频振幅反馈给你,像华为p7就是这样,这种情况肯定不能再去检测音频振幅了,只能另辟蹊径,通过我的观察发现在用MediaRecorder录音时,如果被禁止那么本地不会出现录音文件,所以我们可以以此为突破口,检测本地是否有生成的录音文件来判断系统是否禁止了我们的录音权限。AudioRecord我没试,大家可以试试。
后续
谷歌了很多方法都没解决,所以就自己动手分析了一下,如果你有更好的方法,求赐教啊求赐教!不胜感激!如果你觉得好,帮你解决了问题,希望能点个赞,或者留个言,给我点动力哈,非常感谢!