录音权限与摄像头权限

(一)、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我没试,大家可以试试。

后续

谷歌了很多方法都没解决,所以就自己动手分析了一下,如果你有更好的方法,求赐教啊求赐教!不胜感激!如果你觉得好,帮你解决了问题,希望能点个赞,或者留个言,给我点动力哈,非常感谢!

时间: 2024-10-10 12:30:26

录音权限与摄像头权限的相关文章

通过应用打开系统中设置(定位权限,摄像头权限等等)

方法一: NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; } /

Android 录音和摄像头权限适配【转】

本文转载自:http://blog.csdn.net/self_study/article/details/52965045 最近在研究权限适配的相关内容,整理以前的权限博客如下:  android permission权限与安全机制解析(上)  android permission权限与安全机制解析(下)  Android 悬浮窗权限各机型各系统适配大全  这篇博客主要是介绍录音权限和摄像头权限的适配,android permission权限与安全机制解析(下)这篇博客中我介绍到了 6.0 之

Android权限之动态权限

安卓系统的权限管理机制从API 23 (也就是Android 6.0 又叫做 Android M,)之后发生了比较大的改变,在一些比较危险的权限上要求必须申请动态权限,即使你在AndroidMainfest.xml文件中申请也没有任何用,或者你可以将编译的目标版本设定这API 22,这样就可以了.但这并不是长久之计,不是吗?所以因此在这里学习一下. 动态权限需求原因 Android 6.0之前,权限在应用安装过程中只询问一次,以列表的形式展现给用户,然而大多数用户并不会注意到这些,直接就下一步了

理解基本权限以及特殊权限:Suid 、Sgid、Sticky以及acl

理解基本权限以及特殊权限:Suid .Sgid.Sticky以及acl 在Linux中特殊权限是什么?为什么要设定特殊权限?回答这个问题前,我们不妨思考为什么要设定权限? 大家知道Linux中一切皆文件.不论你是什么,在linux系统中都会被当做一个文件来看待.无论你是文本或目录,硬件或软件,图片或视频等等,统统都被当做文件来看待.所以,在linux中,文件的重要性不言而喻.那么如何更合理的管理好文件呢?文件的权限管理是很重要的一环,所以接下来我将介绍文件的基本权限以及特殊权限. 基本文件权限

文件夹共享权限与NTFS权限

1.共享权限 共享权限有三种:完全控制.更改.读取 任务:了解共享权限 步骤:打开一共享文件夹,查看其共享权限 注意:共享权限只对从网络访问该文件夹的用户起作用,而对于本机登录的用户不起作用. 2.NTFS权限 NTFS权限是NT和Win2000中的文件系统,它支持本地安全性.换句话说,他在同一台计算机上以不同用户名登录,对硬盘上同一文件夹可以有不同的访问权限. 注意:NTFS权限对从网络访问和本机登录的用户都起作用.3.共享权限和NTFS权限的联系和区别 (1)共享权限是基于文件夹的,也就是说

文件与文件夹的默认权限与隐藏权限

除了基本r, w, x权限外,在Linux的Ext2/Ext3文件系统下,我们还能够配置其它的系统隐藏属性, 这部份可使用 chattr来配置,而以 lsattr 来查看. 文件默认权限:umask umask 就是指定眼下使用者在创建文件或文件夹时候的权限默认值. # umask 0022 <==与一般权限有关的是后面三个数字! # umask -S u=rwx,g=rx,o=rx 查阅的方式有两种.一种能够直接输入 umask ,就能够看到数字型态的权限配置分数,一种则是增加 -S (Sym

权限管理ACL权限

简介 文件的权限一般主要针对三种用户类型:所有者.用户组.其他人:如果有一个用户,我们希望他对文件的权限不在上述三种用户权限之内,我们需要怎么做呢?再新添一个用户组,并将该用户组设为文件的用户组?不可以,一个文件只能有一个用户组,如果指定了新的用户组,之前的用户组将作废.ACL命令就是为了解决三种基本用户类型不满足要求时的问题 查看分区的ACL权限是否开启 ACL权限需要文件所在的分区的支持:首先查看一下系统有哪些分区,使用df -h命令 根分区的文件系统是/dev/sda5,查看该分区是否开启

五大权限:UGO权限、SetUID SetGID Sticky、ACL权限、chattr(文件系统级别的权限)、SELINUX

五大权限:UGO权限.SetUID SetGID Sticky.ACL权限.chattr(文件系统级别的权限).SELINUX ======================文件属性以及ugo权限================================== ls -l 列出文件的属性 linux文件的类型包括以下六种: -  普通文件 d 目录文件 l  链接文件 b block类型的设备文件  块设备文件 c 字符型的设备文件 s socket文件 网络类型的文件 p 管道类型的文件 u

Android 开发技巧 - Android 6.0 以上权限大坑和权限检查基类封装

简单介绍 关于运行时权限的说法,早在Google发布android 6.0的时候,大家也听得蛮多的.从用户的角度来讲,用户是受益方,更好的保护用户的意思,而对于开发者来说,无疑增加了工作量. 对于6.0以下的权限在安装时,会根据权限声明产生一个权限列表,用户只有同意才能完成app的安装.而在6.0以后,不需要先对权限授权就可以安装app,对于权限的授权我们可以选择禁止. 在新的权限机制中,Google将权限分为两类: Normal Permissions(普通权限):不涉及用户隐私,不需要用户进