checkSelfPermission总是返回PERMISSION_GRANTED
今天在实现录音功能的权限申请时遇到了问题,然后网上找资料,基本都是分割线下面的解决方法,但是在我的Smartisan OS V3.7.0.2(android 6.0 23), 项目中target sdk version设置为了22。
令人疑惑的是 录音权限在设置为每次询问时,PermissionChecker#checkSelfPermission总是返回PERMISSION_GRANTED,让我调试的开始怀疑人生了,我找了一台android 7.0的原生的手机就是ok的,当然原生的手机只有录音权限只有开和关两项,并没有每次询问,我初步怀疑是厂商的代码导致的该问题
在录音的时候,针对录制的过程还是要加try catch进行捕获异常,防止由于没有权限导致崩溃,其他权限可以类似处理,根据catch到的异常进行处理,优化用户体验。
------------------------------------------------------------分割线---------------------------------------------------------------------
以下内容引自其他博客:
Android M运行targetSdkVersion < 23的应用时,调用checkSelfPermission,不管用户是否取消授权,checkSelfPermission的返回值始终为PERMISSION_GRANTED的解决办法
If your application is targeting an API level before 23 (android M) then both:ContextCompat#checkSelfPermission and Context#checkSelfPermission doesn't work and always returns 0 (PERMISSION_GRANTED). Even if you run the application on Android 6.0 (API 23).
It's not fully true that if you targeting an API level before 23 then you don't have to take care of permissions. If you targeting an API level before 23 then:
Android < 6.0: Everything will be ok.
Android 6.0: Application's run-time permissions will be granted by default (compatibility mode applies), but the user can change run-time permissions in Android Settings, then you may have a problem.
As I said in the 1st point, if you targeting an API level before 23 on Android 6.0 then ContextCompat#checkSelfPermission and Context#checkSelfPermission doesn't work. Fortunately you can use PermissionChecker#checkSelfPermission to check run-time permissions.
Example code:
- public boolean selfPermissionGranted(String permission) {
- // For Android < Android M, self permissions are always granted.
- boolean result = true;
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- if (targetSdkVersion >= Build.VERSION_CODES.M) {
- // targetSdkVersion >= Android M, we can
- // use Context#checkSelfPermission
- result = context.checkSelfPermission(permission)
- == PackageManager.PERMISSION_GRANTED;
- } else {
- // targetSdkVersion < Android M, we have to use PermissionChecker
- result = PermissionChecker.checkSelfPermission(context, permission)
- == PermissionChecker.PERMISSION_GRANTED;
- }
- }
- return result;
- }
In order to obtain target Sdk Version you can use:
- try {
- final PackageInfo info = context.getPackageManager().getPackageInfo(
- context.getPackageName(), 0);
- targetSdkVersion = info.applicationInfo.targetSdkVersion;
- } catch (PackageManager.NameNotFoundException e) {
- e.printStackTrace();
- }
It works on Nexus 5 with Android M.
---------------------------------------------------------------------------分割线----------------------------------------------------------------------
checkSelfPermission总是返回PERMISSION_GRANTED相关推荐
- Android 6.0 运行时权限处理完全解析
一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http:// ...
- Android 6.0动态权限
新项目,新苦B开始, 从Android 6.0(API 23)开始,允许用户在应用运行时决定是否允许权限,而不是在应用安装的时候.这种方法简化了应用的安装过程,因为用户在安装或更新应用的时候不需要允许 ...
- android 权限动态申请
名字其实有点让人感觉高大上"权限动态申请",其实也没有什么, 以前做Android程序的时候,比如需要打开摄像头 那么需要在 然后就可以了, 但是Android6.0之后呢,有些权 ...
- Android M 新的运行时权限开发者需要知道的一切
android M 的名字官方刚发布不久,最终正式版即将来临! android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响.惊讶的是android社区鲜有谈论这事儿 ...
- Android M(6.0) 权限相关
原文链接:http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/ Android M 新的运行时权限开发者需要知道的一切 andr ...
- android新运行时权限
新运行时权限 android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次.一旦安 ...
- android 崩溃捕获_Android从相机和图库捕获图像
android 崩溃捕获 In this tutorial we'll develop an application that picks an image from camera or galler ...
- Android Location API跟踪您当前的位置
Android Location API can be used to track your mobile current location and show in the app. In this ...
- Android Studio实现文字识别(基于百度云OCR)
前言:之前配置好Android Studio后,一直在参与课程的两个项目,未能及时更新,最近期末考试,可能又要断更一段时间.今天验收好,跟大家分享一下其中我负责的相机相册调用以及文字识别的部分,大家根 ...
- Adroid11,拍照,裁剪以及保存图片
目录 1. 文件权限问题 2. 拍照权限和布局文件 3. 一些用的上的工具函数 4. 结果展示 完成毕业设计的需要,Android11要求实现图片拍照并裁剪,例如头像的选取.真机redmi k20:A ...
最新文章
- linux设置开机服务自动启动/关闭自动启动命令
- CSS兼容性(IE和Firefox)技巧大全
- 【2015沈阳现场A】
- [easyui] 在iframe中操作父窗口的组件
- javascript系列之执行上下文
- netty 远程主机强迫关闭了一个现有的连接_死磕netty系列《一、netty基础概念》...
- 设计模式之代理:手动实现动态代理,揭秘原理实现
- 计算机的数据库应用领域,【信息管理论文】信息管理中计算机数据库技术的应用(共4410字)...
- springboot2.0新特性
- Redis高并发5-redis数据持久化之企业应用
- Python-docx 读取word.docx内容
- 人脸识别系统落地酒店 刷脸入住更安全
- java获取异常行数,如何增加Java堆栈跟踪转储的显示行数?
- 一文详解Adobe Photoshop 2020安装教程
- 4本建模必读的书籍,每天学一点,获益匪浅
- 悠哈牛奶糖为什么有五种味道单独装的,而不是混合装的
- 计算特征根时出现复数 ComplexWarning: Casting complex values to real discards the imaginary part
- 如何使用Dart的Stream(一)
- python刷步数程序设计_利用python+云函数搭建自己的修改步数api接口
- Python 分析近2000条“数据分析”相关岗位招聘信息