Android 开发中的权限申请

这篇具有很好参考价值的文章主要介绍了Android 开发中的权限申请。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、权限动态申请

        我们都知道,从 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<String> 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 中添加读写权限如下:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

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 添加属性关闭作用域存储,这时谷歌官方提供的一个暂时解决方案。

<application
    android:requestLegacyExternalStorage="true">

</application>

4、外部存储权限

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

Manifest.xml 新增外部存储权限

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />

手动设置打开

        该权限属于特殊权限需要用户手动去设置中打开,通过 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:是否可以将上面的判断包名变成判断签名,待验证。

权限白名单(最优)

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

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

3、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 中弹框时判断处理,但是根据需求也需要进行签名验证。

可行方案预测(待验证)

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

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

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

        需要直接通过的APP需要使用指定签名,同时还需要申请我们自定义的新权限。文章来源地址https://www.toymoban.com/news/detail-484706.html

到了这里,关于Android 开发中的权限申请的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android之动态申请权限

    Android 6.0 (API 23) 之前应用的权限在安装时全部授予,运行时应用不再需要询问用户。在 Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私的权限可在运行时根据用户的需要动态授予。 Android 6.0以下,在AndroidManifest.xml文件中注册权限即可。 Android 6.0及其以后,既

    2024年02月04日
    浏览(48)
  • android 12 SD动态申请读写权限

    android 12不仅需要在AndroidManifest.xml申请读写权限也需要在代码中动态的申请 关于如何动态申请读写权限仅需要两步 在AndroidManifest.xml文件中申请读写权限 在代码的启动MainActivity中动态申请方法 下面是关于动态权限申请的Manifest.class类大家有兴趣可以去了解下

    2024年02月11日
    浏览(42)
  • 蓝牙开发之-Android12及以下权限申请 及蓝牙详细流程图

    一、蓝牙开发之-权限申请, 直接上代码 第一步、在 AndroidManifest.xml 中 声明下需要的权限 第三步、权限拿到了,就扫描、连接、进行通信 吧 附上流程图

    2024年04月13日
    浏览(54)
  • Android申请权限(相机权限和读写权限)

    开发一个相机应用,需要申请三个权限:相机、读文件、写文件。 初步授权成功

    2024年02月11日
    浏览(55)
  • android11 申请所有文件访问权限

    Android 11 引入了强制执行分区存储的限制,导致应用默认不能访问外部文件。 针对以前涉及较多文件的操作,可采用申请所有文件访问权限的方式来解决这一问题,实现方式如下。 (虽然这样做安全性低,官方并不推荐这样,但确实最快适配原有应用程序的方式) 1. Android

    2024年02月04日
    浏览(45)
  • Android11及以上 文件读写权限申请

    Android11 读写权限申请 Android11系统对应用写入权限做了严格的限制。本文介绍如何获取文件读写权限。项目中 build.gradle 的 targetSdkVersion = 29 ,会出现读写问题。 当 targetSdkVersion = 29,通过设置requestLegacyExternalStorage=“true”,还能解决。 当 targetSdkVersion = 30后,需要申请所有文件

    2023年04月10日
    浏览(60)
  • android 11后文件读写访问权限申请

    android 11后对文件读写访问权限管理 与 android 10又有了新的要求,导致在读写或者访问时出现error:java.io.FileNotFoundException: /storage/emulated/0/file_path open failed: EACCES (Permission denied),以下为android 11文件管理权限申请办法 回忆android 10 文件访问权限申请 step 1: AndroidManifest中添加权限申

    2024年02月05日
    浏览(47)
  • Android 获取SIM卡号码权限申请

    在AndroidManifest.xml中添加如下权限 uses-permission android:name=\\\"android.permission.READ_PHONE_STATE\\\"/ 如果你只在清单文件中添加权限却没有在代码中获取权限,代码还是会报错的。 报错原因: android 6.0以上增加了动态获取权限api,需要动态获取手机的权限。弹出对话框询问用户,请求用户

    2024年02月08日
    浏览(43)
  • Unity 在Unity端申请Android权限

    前段时间还在职的时候,遇到这么一个问题:SDK首次调起相机接口进行拍照的时候,会调起2次相机。并在第2次拍照后闪退。 分析了一下,都是发生在首次获取权限时才会发生,拿到权限就不会了。并且2台会发生这种情况的Android版本都是13。猜测是SDK获取权限接口没有适配好

    2024年02月15日
    浏览(44)
  • Android Permission 权限申请,EasyPermission和其他三方库

    在Android的实际开发中,经常会因为需求的实现,需要申请用户权限。 今天总结下Android中常用的权限申请。 一、基本介绍和流程 Android中的权限申请是通过应用程序与操作系统之间的交互实现的。在Android中,每个应用程序都被赋予了一组预定义的权限,这些权限定义了应用程

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包