Android Framework权限篇之RuntimePermission整体流程

本文详细阐述了Android系统的权限保护机制,包括不同级别的权限分类,运行时权限的申请流程,以及如何在不同SDK版本下处理权限请求。重点介绍了如何在应用中请求和管理dangerous级别的权限,以及权限被拒绝后的处理策略。
摘要由CSDN通过智能技术生成

概述

权限的作用是保护Android用戶的隐私。

如果设备搭载的是Android 6.0(API 级别 23)或更高版本,并且应用的targetSdkVersion 是23或更高版本,用戶在安装时不会收到任何应用权限的通知。您的应用必须在运行时请求用戶授予危险权限。当应用请求权限时,用戶会看到一个系统对话框,告知用戶应用正在尝试访问的权限组。该对话框包括拒绝和允许按钮。如果用戶选中不再询问复选框并点按拒绝,当您以后尝试请求相同权限时,系统不会再提示用戶。

如果设备搭载的是Android5.1.1(API级别22)或更低版本,或者应用在任何版本的Android上运行时其targetSdkVersion 是22或更低版本,系统将在安装时自动请求用戶向应用授予所有危险权限

在这里插入图片描述

权限保护级别

权限的分类总共有如下几种,先有个总览,本篇文章后面是展开讨论dangerous类型即运行时权限的整体流程。

级别 描述
normal 如果应用在清单中声明需要普通权限,系统会在安装时自动向应用授予该权限。系统不会提示用户授予普通权限,用户也无法撤消这些权限
dangerous 为了使用危险权限,应用必须在运行时提示用户授予权限
signature 在安装时授予这些应用权限,但仅会在尝试使用某权限的应用签名证书为定义该权限的同一证书时才会授予(即相同签名)
signatureOrSystem signature privileged

这里做Android Framework权限开发的经常会遇到系统app的同事过来问权限问题,我这个app是在/system/app目录下的,并且需要的这个权限是signature级别的;为什么在AndroidManifest声明了之后没有默认授予?可以结合下图总结看下;

在这里插入图片描述

运行时权限申请

这里开始看下运行时权限的整体流程;正常应用的权限申请过程如下,先看下应用是如何申请运行时权限,再从应用侧到Framework侧看下去; 更多应用权限请求细节可以参考这里

    private fun requestPermmission() {
   
        // 判断是否需要运行时申请权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ContextCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
   
            // 判断是否需要对用户进行提醒,用户点击过拒绝&&没有勾选不再提醒时,即拒绝一次时进行提示
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)) {
   
                // 给用户予以权限解释, 对于已经拒绝过的情况,先提示申请理由,再通过点击弹出的Dialog进行申请
                showDialog("需要打开电话权限直接进行拨打电话,方便您的操作")
            } else {
   
                // 无需说明理由的情况下,直接进行申请。如:1.第一次使用该功能(第一次申请权限),2.用户拒绝权限并勾选了不再提醒,3.已授权 这3种情况shouldShowRequestPermissionRationale()返回false
                ActivityCompat.requestPermissions(
        this, new String[]{
   Manifest.permission. CALL_PHONE,}, 1);
            }
        } else {
   
            // 拥有权限直接进行功能调用
            callPhone();
        }
    }

    /**
     * 权限申请回调
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
   
        // 根据requestCode判断是那个权限请求的回调
        if (requestCode == REQUEST_PERMISSION_CODE_CALL_PHONE) {
   
            // 判断用户是否同意了请求
            if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
   
                callPhone()
            } else {
   
                // 未同意的情况
                if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)) {
   
                    // 判断是拒绝一次的情况,则同样先是弹Dialog提示用户,再重新申请权限
                    showDialog("需要打开电话权限直接进行
在Java中,自定义权限掩码(Custom Permission Masks)通常是在使用Java安全模型(Java Security Model)时,为特定操作或权限分配的一种抽象表示。这个模型用于控制代码运行时对系统资源(如文件、网络连接等)的访问权限。 在Java中,权限是由一组位(bits)组成的掩码,每个位代表一种特定的权限级别。例如,`java.lang.RuntimePermission` 类提供了一组预定义的权限,比如 `accessClassInPackage` 和 `setContextClassLoader`,它们都有自己的二进制掩码。 如果你需要自定义权限,你可以创建一个新的权限类,继承自 `java.security.Permission` 或其子类,比如 `BasicPermission` 或 `RuntimePermission`。然后,你需要为这个新权限定义一个名称和一个掩码字符串,该字符串通常是一个以`"permissionName=mask"`格式表示的字符串,其中`permissionName`是权限的类别名,`mask`是你自定义的二进制掩码。 例如: ```java public class MyCustomPermission extends BasicPermission { public MyCustomPermission(String name) { super(name); } private static final String MASK = "00000001"; // 假设这是一个自定义的四位掩码,表示四种不同的权限级别 } // 使用自定义权限 MyCustomPermission permission = new MyCustomPermission("myCustomAction"); System.out.println(permission.getName()); // 输出 "myCustomAction" System.out.println(permission.getActions()); // 输出 "myCustomAction" ``` 在实际应用中,可能需要在`Policy`或`PolicyProvider`中注册这些自定义权限,并在`SecurityManager`的检查方法中处理这些权限的验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值