IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android动态权限总结,阿里Android研发岗二面 -> 正文阅读

[移动开发]Android动态权限总结,阿里Android研发岗二面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q7wAOHII-1630036653611)(https://user-gold-cdn.xitu.io/2018/11/3/166d7d9ec57e2cee?imageView2/0/w/1280/h/960/ignore-error/1)]

核心API介绍

检查权限是否已获取:

// ContextCompat.java
public static int checkSelfPermission(@NonNull Context context, @NonNull String permission)

// PermissionChecker.java
public static int checkSelfPermission(@NonNull Context context,
            @NonNull String permission) 

这两个方法都是检查权限是否获取的方法,但ContextCompat.checkSelfPermission在某些系统上(如基于Android8.0的MIUI10检查短信权限时)有bug, 不能准确判断权限是否已获取,此时可结合PermissionChecker.checkSelfPermission进行判断, 所以判断权限是否已获取可采用以下实现:

public static boolean hasPermission(@NonNull Context context, @NonNull String permission) {
    if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED
            || PermissionChecker.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
        return false;
    }

    return true;
} 

申请权限

当未获取权限时,需要向系统请求,请求时使用requestPermissions方法:

// ActivityCompat.java
// 在Activity中申请权限
public static void requestPermissions(final @NonNull Activity activity,
            final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode)
        

// Fragment.java
// 在Fragment中申请权限
public final void requestPermissions(@NonNull String[] permissions, int requestCode) 

在Fragment使用ActivityCompat.requestPermissions申请权限时,如果用户拒绝了(且勾线了不再提示)请求,Fragment中的onRequestPermissionsResult不会被回调,也就不能引导用户开启权限。所以在Fragment中应该使用Fragment的成员方法requestPermissions来请求权限。

检查APP是否应该向用于展示申请权限的解释

// ActivtyCompat.java
// 检查APP是否应该向用于展示申请权限的解释
public static boolean shouldShowRequestPermissionRationale(@NonNull Activity activity, @NonNull String permission); 

此方法的返回值解释如下:

  • 当APP从未申请过指定的权限或申请了指定权限,但被用户拒绝,且勾选了【不再提示】,返回false;
  • APP申请指定权限时被用户拒绝,但未勾选【不再提示】,返回true

所以在使用此方法时,我们要先判断APP是否已申请过权限,否则难以判断返回false的两种情况。

申请权限的结果回调

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 

这是Activity和Fragment中申请权限的结果回调方法,其中permissions表示申请的权限数组,grantResults表示每个权限的请求结果。取值为:

// 获得授权
public static final int PERMISSION_GRANTED = 0;
// 未获授权
public static final int PERMISSION_DENIED = -1; 

通常申请权限后的处理逻辑都是在该方法中实现。

动态权限申请的实现

动态申请权限的条件:

  • targetSdkVersion >= 23;
  • Android系统版本在6.0及以上;

对于不能同时满足以上条件的情况,默认使用的静态申请权限的方式,但不同的ROM为了安全性,可能对其机制进行了修改,所以可能因ROM不同而有所差异。

了解了申请权限的核心API,接下来就介绍一下在Activity中申请权限的实现过程,下面以点击申请拍照权限为例:

private void startPhoto() {
    if (hasPermission(this, new String[]{Manifest.permission.CAMERA})) {
        // 执行拍照的逻辑
    } else {
         ActivityCompat.requestPermissions(context, rnew String[]{Manifest.permission.ACCESS_FINE_LOCATION}),
                        PERMISSION_REQUEST_CODE);
    }
} 

然后在onRequestPermissionsResult中监听权限申请的结果:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
	super.onRequestPermissionsResult(requestCode, permissions, grantResults);
	
    if (hasPermission(permissions)) {
        // 执行拍照的逻辑
    } else {
        if (ActivityCompat.shouldShowRequestPermissionRationale(context, permissions[refusedPermissionIndex])) {
            // 向用户展示申请权限的理由
        } else {
            // 引用用户去开启权限
        }
    }
fusedPermissionIndex])) {
            // 向用户展示申请权限的理由
        } else {
            // 引用用户去开启权限
        }
    }
 
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:27:50  更:2021-08-28 09:29:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 6:25:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码