返回顶部
首页 > 资讯 > 移动开发 >Android 开发中的权限申请
  • 119
分享到

Android 开发中的权限申请

android 2023-09-01 06:09:20 119人浏览 薄情痞子
摘要

一、权限动态申请         我们都知道,从 Android 6.0 开始,部分危险权限在 xml 注册的同时,还需要动态申请。 1、需要动态申请的权限 Manifest.permission.CONTACTS //联系人Manifes

一、权限动态申请

        我们都知道,从 Android 6.0 开始,部分危险权限在 xml 注册的同时,还需要动态申请。

1、需要动态申请的权限

Manifest.permission.CONTACTS //联系人Manifest.permission.PHONE //电话Manifest.permission.CALENDAR //日历Manifest.permission.CAMERA //相机Manifest.permission.SENSORS //传感器Manifest.permission.LOCATION //位置Manifest.permission.STORAGE //存储Manifest.permission.MICROPHONE //麦克风Manifest.permission.CONTACTS //短信

        需要动态申请的权限主要分为这 9 类,当然每类中可能不止一个权限,但只要动态申请一个就默认获取整个类别的权限。

2、申请单个权限

//常量,用于回调int MY_PERMISSION_APPLY = 1;//要使用的相机权限int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);//判断是否有相机权限if (permission == PackageManager.PERMISSION_GRANTED) {    //有权限直接执行            } else {     //没有权限,提示获取权限    String[] perms = {"android.permission.CAMERA"};    ActivityCompat.requestPermissions(this, perms, MY_PERMISSION_APPLY);}

        在弹出权限申请后,需要对用户的选择结果进行处理,在回调方法中执行:

public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){    switch(permsRequestCode){        case MY_PERMISSION_APPLY:            boolean albuMaccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;            if(!albumAccepted){                //用户拒绝了权限            }else{                //用户同意了权限            }            break;    }}

 3、同时申请多个权限

//常量,用于回调int MY_PERMISSION_APPLY = 1;//要使用的相机和存储权限String[] permissions = new String[]{            Manifest.permission.CAMERA,            Manifest.permission.STORAGE    };//用于存放未同意的权限List mPermissionList = new ArrayList<>(); //清空未同意权限mPermissionList.clear();//循环得到未同意权限for (int i = 0; i < permissions.length; i++) {    if (ContextCompat.checkSelfPermission(mContext, permissions[i]) != PackageManager.PERMISSION_GRANTED) {        mPermissionList.add(permissions[i]);    }} //判断是否有未同意权限if (mPermissionList.isEmpty()) {    //都有权限直接执行  } else {    //将List转为数组    String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);    ActivityCompat.requestPermissions(this, permissions, MY_PERMISSION_APPLY);}

        然后,同样添加上面的回调方法处理用户的选择结果。 

二、本地文件读写权限变更

        需求:Android 11.0 版本,sdk 32,使用本地 Download 下文件,在申请动态权限后,仍然提示缺少权限问题。

1、Manifest.xml

        我们都知道 Android 开发某些功能(文件读写)时需要在 Manifest.xml 中添加对应权限。才能对 Android 手机中的图片、文件等内容进行处理。Manifest.xml 中添加读写权限如下:

2、动态权限

        Android 6.0 时在 Manifest.xml 添加权限的同时,还需要在使用时动态申请权限,这个大家应该也很熟悉,这里仅展示权限申请代码,至于用户拒绝、不再提示等操作及回调不再展示。

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M        && context.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {//请求权限    ((Activity)context).requestPermissions(new String[]{            Manifest.permission.READ_EXTERNAL_STORAGE,            Manifest.permission.WRITE_EXTERNAL_STORAGE},1);}

3、作用域存储

        Android 10.0 开启了作用域存储,即使完成了上面的 Manifest.xml 中添加权限和代码中动态申请权限,在访问包名以外的文件夹时,依旧提示权限不足。这时我们在 Manifest.xml 添加属性关闭作用域存储,这时谷歌官方提供的一个暂时解决方案。

4、外部存储权限

        Android 11.0 开始,作用域存储开始强制启用,上面的关闭方法不在起作用,这时如果还需要访问外部文件夹,就需要用户手动开启一个危险权限——外部存储权限。

Manifest.xml 新增外部存储权限

手动设置打开

        该权限属于特殊权限需要用户手动去设置中打开,通过 Environment.isExternalStorageManager() 判断是否开启,未开启跳转设置开启界面。

public static boolean checkStorageManagerPermission(Context context) {    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) {        Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);        context.startActivity(intent);        return false;    }    return true;}

        打开后就可以正常访问 Download 等共享目录了。

三、危险权限弹窗处理

1、需求分析

1)系统应用直接授予权限

2)使用指定签名第三方应用直接授予权限

3)使用普通签名第三方应用正常提示

2、实现方案分析

系统APP

        系统 APP 可以直接修改 DefaultPermissionGrantPolicy.java 中的 grantDefaultSystemHandlerPermissions() 方法直接为系统应用配置默认权限。

限制条件:需要修改系统源码,所以第三方应用无法实现

文件位置:frameworks/base/services/core/java/com/android/server/pm/permission/

修改权限属性

1)直接修改权限级别在 frameworks/base/core/res/AndroidManifest.xml 中将 dangerous(危险)权限修改为 nORMal(正常)权限,所有应用均直接获得权限,不适用上面需求。

2)将 dangerous(危险)权限修改为 Signature(签名)权限,这样指定签名APP可以获得权限,但第三方其他签名 APP 无法获取权限。

        ps:是否可以设置同名权限:例如设置摄像头同名权限,级别 Signature,同签名自动拥有权限,其他第三方APP申请默认dangerous 摄像头权限弹出提示。

        需要验证,感觉可行性不大。

指定APP通过权限

        PackageManagerService.java 的grantPermissionsLpw 中添加指定包名通过权限,网络上很多资料都可以找到该方法,但现在的源码中找到了该文件,未找到该方法。

        ps:是否可以将上面的判断包名变成判断签名,待验证。

权限白名单(最优)

/frameworks/base/core/res/res/values/config.xml中增加包名白名单

/frameworks/base/core/res/res/values/symbols.xml中声明白名单变量

frameworks/base/services/core/java/com/android/server/pm/ permission/PermissionManagerService.java中的grantPermissions方法中判断权限白名单

 参考:Android 9.0 设置白名单赋予应用权限 - 二的次方 - 博客园

        该方法添加白名单也需要修改配置文件,所以第三方指定签名文件也无法直接得到权限。所有权限通过也不适用。

        但通过源码逻辑发现,下面代码应该是APP系统签名判断方法:

if(bp.isSignature()){    allowedSig = grantSignaturePermission(perm, pkge, bp, origPermissions);}

        所以上面的判断白名单可以改成判断签名通过权限,即:

if(bp.isRuntime()){    else{        allowedSig = grantSignaturePermission(perm, pkge, bp, origPermissions);        if(allowedSig){            grant = GRANT_INSTALL;        }    }}

        这样使用指定签名APP和系统APP都能跳过权限验证。

直接处理提示框

        直接在 GrantPermissionsActivity 中弹框时判断处理,但是根据需求也需要进行签名验证。

可行方案预测(待验证)

在 AndroidManifest.xml 中自定义一个新权限,级别为Signature;

在DefaultPermissionGrantPolicy.java将新定义的权限加入权限组;

        这样指定签名的应用直接获得了新权限,又因为同组权限只要有一个权限是通过状态,其他权限不在验证直接通过。

        需要直接通过的APP需要使用指定签名,同时还需要申请我们自定义的新权限。

来源地址:https://blog.csdn.net/c19344881x/article/details/128920179

--结束END--

本文标题: Android 开发中的权限申请

本文链接: https://lsjlt.com/news/387679.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android 开发中的权限申请
    一、权限动态申请         我们都知道,从 Android 6.0 开始,部分危险权限在 xml 注册的同时,还需要动态申请。 1、需要动态申请的权限 Manifest.permission.CONTACTS //联系人Manifes...
    99+
    2023-09-01
    android
  • Android---动态权限申请
    目录 权限分类 动态权限核心函数 简易实现案例 完整代码     Google 在 Android 6.0 开始引入了权限申请机制,将所有权限分成了正常权限和危险权限。App 每次在使用危险权限时需要动态的申请并得到用户的授权才能使用。 权...
    99+
    2023-09-05
    android 数码相机
  • Android 6.0中怎么申请动态权限
    Android 6.0中怎么申请动态权限?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。如果设备运行的是 Android 6.0(API 级别 23)或更高版本,并且应用的 ta...
    99+
    2023-05-31
    android android6.0 roi
  • Android动态权限申请详解
    目录前言使用方案绕过生命周期检测最终实现总结前言 注:只想看实现的朋友们可以直接跳到最后面的最终实现 大家是否还在为动态权限申请感到苦恼呢?传统的动态权限申请需要在Activity中...
    99+
    2023-05-17
    Android动态权限申请 Android权限申请
  • Android申请相机权限和读写权限实例
    开发一个相机应用,需要申请三个权限:相机、读文件、写文件。 1、在AndroidManifest.xml中添加 <uses-permission android:name="a...
    99+
    2024-04-02
  • Android 6.0动态权限申请教程
    PermissionManage 项目地址:https://github.com/why168/AndroidProjects/tree/master/PermissionMa...
    99+
    2022-06-06
    动态 教程 Android
  • Android 6.0权限申请详解及权限资料整理
    在android 6.0开始,部分的权限需要我们动态申请,也就是说当我们的打开app的时候系统不会主动像您申请app所需要的部分权限,需要客户在使用app的时候主动的去申请。 ...
    99+
    2022-06-06
    Android
  • Android 程序申请权限注意事项
    为Android 程序申请权限注意 Android系统提供为程序提供了权限申请,即在manifest中使用uses-permission来申请即可.实现起来非常简单,但是有些问...
    99+
    2022-06-06
    程序 Android
  • android 12 SD动态申请读写权限
    android 12 如何动态申请读写权限 android 12不仅需要在AndroidManifest.xml申请读写权限也需要在代码中动态的申请 关于如何动态申请读写权限仅需要两步 在AndroidManifest.xml文件中申...
    99+
    2023-08-16
    android java 开发语言
  • Android动态权限申请如何实现
    本篇内容介绍了“Android动态权限申请如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Google 在 Android 6.0 开...
    99+
    2023-07-05
  • Android registerForActivityResult动态申请权限案例详解
    前言 这几天在做一个小工具app,结果在fragment里面动态申请权限提示原有的申请方法已经弃用,还画了很明显的删除线。。。这叫一个强迫症的我怎么受得了。赶紧网上找资料也找不出什么...
    99+
    2024-04-02
  • 怎样申请云服务器开通权限
    要申请云服务器开通权限,您可以按照以下步骤进行操作: 登录到提供云服务器服务的网站(例如 Amazon Web Services 或 DynamoDB),并点击“注册并登录”。 进入注册页面,确保您的用户名和密码正确。 在“账户和安全”...
    99+
    2023-10-26
    权限 服务器
  • 如何申请云服务器开通权限
    要申请云服务器开通权限,您可以按照以下步骤进行操作: 登录到公司的云服务器平台,进入到“服务器管理”模块,并点击进入“开通服务”界面。 在开通服务界面中,您需要填写您的基本信息,包括用户名、密码、联系方式等。 在填写完基本信息后,点击“...
    99+
    2023-10-26
    权限 服务器
  • 安卓动态申请权限
    我们在使用一些官方app时,刚下载进去之后经常会弹出各种各样的权限获取请求,今天简单学习了下,希望不会误人子弟哈哈哈哈。 一、将需要用到的权限添加到Manifest清单里  这一步很重要,本人Debug时发现如果缺少这步,进入...
    99+
    2023-09-21
    android
  • Android AOP切面编程+动态权限申请
    AOP+动态权限申请 最近在利用AspectJ做埋点,突发奇想,能否也用类似方法做动态权限申请?发现可以。我来介绍一下我的思路。 AOP是什么 ...
    99+
    2022-06-06
    aop 动态 Android
  • Android Permission 权限申请,EasyPermission和其他三方库
    在Android的实际开发中,经常会因为需求的实现,需要申请用户权限。 今天总结下Android中常用的权限申请。 一、基本介绍和流程 Android中的权限申请是通过应用程序与操作系统之间的交互实现的。在Android中,每个应用程序都被...
    99+
    2023-09-07
    android
  • Android动态权限申请实现步骤分解
    目录权限分类动态权限核心函数简易实现案例完整代码 Google 在 Android 6.0 开始引入了权限申请机制,将所有权限分成了正常权限和危险权限。App 每次在使用危险权限时需...
    99+
    2023-05-14
    Android动态权限申请 Android权限动态申请 Android申请权限
  • 如何申请云服务器开通权限呢
    要申请云服务器开通权限,您可以按照以下步骤进行操作: 登录到IaaS云服务平台(如Yun cloud、Cloudflare 或OpenStack):在这里您可以登录您的云服务器并创建账户。 选择租赁云服务器的服务:在这里您可以选择您需要...
    99+
    2023-10-26
    权限 服务器
  • 怎样申请云服务器开通权限呢
    要申请云服务器开通权限,您可以按照以下步骤进行操作: 登录到需要开通云服务器权限的公司网站或应用程序; 点击“开通云服务器”按钮,进入申请页面; 在“开通服务器”页面中,根据您的需求选择“普通权限开通”或“高级权限开通”; 勾选您需要开...
    99+
    2023-10-26
    权限 服务器
  • Android无需申请权限拨打电话的两种方式
    Android打电话有两种实现方法: 第一种方法,拨打电话跳转到拨号界面。源代码如下: Intent intent = new Intent(Intent.ACTION_DI...
    99+
    2022-06-06
    电话 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作