android-discuss icon indicating copy to clipboard operation
android-discuss copied to clipboard

如何检测AudioRecord是否获得了录音权限?

Open start141 opened this issue 9 years ago • 16 comments

MediaRecorder可以给prepare和start方法加try catch判断是否获得了录音权限。 但是这招在AudioRecord上却不起效,并不会抛异常。

有人知道有什么方法可以判断AudioRecord是否获得了录音权限吗?

start141 avatar Jun 08 '15 06:06 start141

@lizhangqu 这只能判断Manifest是否有注册权限吧? 不能判断权限是否被系统禁用吧?

lixi0912 avatar Jun 15 '15 08:06 lixi0912

可以考虑运行时分析Manifest中的权限设置

mooncong avatar Jun 16 '15 04:06 mooncong

在录音时,可在很短时间内检查录音得到的数据,如果录下来的数据为0,则表示没有录音权限,可能被第三方软件禁止

renkangke avatar Jun 16 '15 04:06 renkangke

我在网上查到说录音权限被禁止后返回什么数据跟设备有关,有些设备是0,有些就不是。

start141 avatar Jun 16 '15 04:06 start141

Android 目前的版本并没有权限控制,现在某些机型的权限控制是第三方自己加入的,实现方式各异,所以这个问题根本没有答案。

但是一般来说,厂家设计权限控制无非是两种,一种是抛异常,一种是对应的服务启动失败,或者给的数据是垃圾数据,比如有些相机权限没有获取时,得到的是一个黑屏照片。所以,理论上,你根本没办法判断。

pgmsoul avatar Aug 30 '15 00:08 pgmsoul

Android M 前权限使用清单全部授权。 Android M 需要运行时授权,具体参看 http://developer.android.com/intl/zh-cn/preview/features/runtime-permissions.html 使用 Context.checkSelfPermission( permission_name) 检查授权。 -请不要在意国内厂商是怎么授权的,你就当已经授权就好了-

Qixingchen avatar Aug 30 '15 02:08 Qixingchen

在国内做app,还是要处理一下权限的问题,而不是按原生系统规则来!

start141 avatar Aug 30 '15 03:08 start141

MediaRecorder可以给prepare和start方法加try catch判断是否获得了录音权限。 但是这招在AudioRecord上却不起效,并不会抛异常。

这招在小米4c上不起作用 @start141

pahoehoe avatar Mar 05 '16 09:03 pahoehoe

AudioRecord在执行其startRecording()方法时会check一下其是否具有所需权限(即使你在Manifest中声明过也可能被某些xx管家意外禁掉),一些加入了动态权限检测的第三方Rom会在此时弹出对话框询问是否赋予权限,此时整个应用的执行被阻塞住,权限的赋予与否将对audioRecord对象的recordingState字段造成影响,所以在startRecording()方法后通过check该字段可判断其所需权限有无:

if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
    Log.d(“TAG”, “permission denied”);
    return;
}

有人推荐通过check一小段AudioRecord读出的buffer中数据是否有效来判别,虽说也可以达到目的,但可操作性不强,而且拿不到权限时也不该继续record的。至于有人提到的Context.checkSelfPermission( permission_name)基本只是check一下你Manifest里给了权限没,权限意外被禁这种事它搞不定的。

Kenber avatar Mar 06 '16 16:03 Kenber

请问最终又找到合适的解决方案吗?

cicoco avatar Apr 21 '16 13:04 cicoco

@lixi0912 这个方法在6.0以上可以判断

spiritedRunning avatar Oct 18 '16 05:10 spiritedRunning

请问最终有找到合适的解决方案吗? +1

forvicky avatar Oct 21 '16 09:10 forvicky

试试这这个 http://blog.flyou.ren/?p=293

cnryb avatar Nov 22 '16 09:11 cnryb

小于 Android6.0:判断录音数据的合法性,比如byte[]里面是否全为0 大于 Android6.0:用系统的API: checkPermission

http://www.jianshu.com/p/7d255fa8247d

08carmelo avatar Apr 25 '17 09:04 08carmelo

为什么不是6.0也需要检查权限啊?

T-Tenma avatar Apr 26 '17 07:04 T-Tenma

@T-Tenma 因为国内手机厂商早在Android6.0出来之前就做了一套权限管理机制,目的跟Android6.0提供的动态权限机制类似,防止一些隐私数据被非法使用。

okgays avatar Apr 28 '17 08:04 okgays