资讯专栏INFORMATION COLUMN

Android工具箱之Android 6.0权限管理

jeffrey_up / 262人阅读

摘要:之前的权限管理在之前,开发者获取设备权限非常的简单,所有的权限会在安装的时候处理。的权限管理最显著的改变是支持用户随时的更改权限,随时的含义包括正在运行。的设备会分两种权限。而权限群允许在某一时间点同时申请多个权限。

这是一个系列,我们将其命名为工具箱,如果你还没有看之前的文章:

Android工具箱之Context解析

Android工具箱之文件目录

Android工具箱之组织你的代码文件

Android工具箱之理解app资源文件

Android工具箱之Activity生命周期

Android工具箱之迁移到AppCompat

概述

默认情况下,一个Android app是不会获取任何权限的。当你的app需要使用任何被设备保护起来的特性的时候(比如发送网络请求,访问照相机,发送短信等),其必须从用户那儿获取到相关的权限。

Android 6.0之前的权限管理

在Android6.0之前,开发者获取设备权限非常的简单,所有的权限会在安装的时候处理。比如一个用户想要安装一个app,那么在安装之前,Android系统会弹出一个对话框,让你能够浏览该应用获取你设备的哪些权限,比如Dropbox:

对于开发者而言,如果你想获取权限,只需要在AndroidManifest.xml文件中申明。举个栗子,获取联系人权限:


    
    
    ...

用户在安装完以后没有任何更改权限的机会。虽然让开发者更方便的处理权限,但是对于用户来说,是个不好的体验。

Android 6.0的权限管理

最显著的改变是Android 6.0支持用户随时的更改app权限,随时的含义包括app正在运行。6.0的设备会分两种权限。

常规权限

何为常规权限,即你只需要在xml中申明,用户不会弹出任何让其选择是否开启权限的弹窗,即静默权限。这些权限包括:网络访问,获取网络状态等。注意:常规的权限,你必须要在xml中申明。


    
    
    ...

运行时权限

如果你想获取的权限不在常规权限列表中,你需要进行运行时权限处理。即你需要在代码中动态的获取权限,系统会弹出对话框供用户选择:

那么如何定义运行权限呢?其实和常规权限是一样的,你需要首先在xml中申明:



    
    ...

接下来,你需要申请权限,然后处理结果。下面的代码将会为你展示这些步骤:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // In an actual app, you"d want to request a permission when the user performs an action
        // that requires that permission.
        getPermissionToReadUserContacts();
    }

    // Identifier for the permission request
    private static final int READ_CONTACTS_PERMISSIONS_REQUEST = 1;

    // Called when the user is performing an action which requires the app to read the
    // user"s contacts
    public void getPermissionToReadUserContacts() {
        // 1) Use the support library version ContextCompat.checkSelfPermission(...) to avoid
        // checking the build version since Context.checkSelfPermission(...) is only available
        // in Marshmallow
        // 2) Always check for permission (even if permission has already been granted)
        // since the user can revoke permissions at any time through Settings
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {

            // The permission is NOT already granted.
            // Check if the user has been asked about this permission already and denied
            // it. If so, we want to give more explanation about why the permission is needed.
            if (shouldShowRequestPermissionRationale(
                    Manifest.permission.READ_CONTACTS)) {
                // Show our own UI to explain to the user why we need to read the contacts
                // before actually requesting the permission and showing the default UI
            }

            // Fire off an async request to actually get the permission
            // This will show the standard permission request dialog UI
            requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
                    READ_CONTACTS_PERMISSIONS_REQUEST);
        }
    }

    // Callback with the request from calling requestPermissions(...)
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String permissions[],
                                           @NonNull int[] grantResults) {
        // Make sure it"s our original READ_CONTACTS request
        if (requestCode == READ_CONTACTS_PERMISSIONS_REQUEST) {
            if (grantResults.length == 1 &&
                    grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "Read Contacts permission granted", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Read Contacts permission denied", Toast.LENGTH_SHORT).show();
            }
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}
权限Groups

当一个app需要大量的权限的时候,如果让开发者每次需要使用权限而弹出对话框,显示是权限的滥用。而权限群允许app在某一时间点同时申请多个权限。但是注意,大多数情况下,你还是应该多带带的去获取单一的权限,但是比如下面这个栗子:当你需要获取联系人读的权限,你向用户申请,而当你读完之后,你需要写的权限,那么你又要向用户申请,这样你可以为它们设置权限群,当你申明读权限的同时,申请写的权限,这样之后你就不用再次申请写的权限了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12550.html

相关文章

  • 不可错过的android好文 - 收藏集 - 掘金

    摘要:针对此种情况,下文把做开发以来遇到的经典问题整理出来,希望对有需要的朋友开发工程师面试指南掘金开发工程师面试指南,作者是陶程,由梁观全贡献部分。 Android 常见问题集锦 - Android - 掘金前言:在开发中,每个人或多或少会遇到各种各样的问题,有些问题依据代码思路调试就可以定位出来,而大部分的问题都是经验性问题,遇到过就很容易解决,但在第一次遇到时往往会花费大量时间来定位问...

    derek_334892 评论0 收藏0
  • Android版本介绍 - 收藏集 - 掘金

    摘要:前言整体架构掘金概述该篇文章主要讲解的整体框架和工作流程,不会涉及到具体的实现。产品汪了解安卓的历史版本吗产品掘金最近在看的设计规范,顺便也熟悉下的版本历史。 关于 Android 7.0 适配中 FileProvider 部分的总结 - 掘金由于 Android 7.0 或更高版本的系统在国内手机市场上的占比不是很高,很多 Android 开发人员并没有做 7.0 适配工作,同时测试...

    teren 评论0 收藏0
  • Android-开发姿势

    摘要:微信这类怎么做谈谈八款开发者必备的小工具八款开发者必备的小工具笔记之图像压缩开发中的图像压缩是一个很重要的部分。 Android 攻城狮—全套必备神级工具(开发,插件,效率) 如果你有用的酸爽的软件,请下面留言。我会持续更新。。。 替你 总结的 Gradle 配置 关于 Gradle 配置的一些总结,欢迎交流! 常用的代码片段,不断更新 项目中平常会用到的代码片段,以及一些收集的好的代...

    jifei 评论0 收藏0
  • Android6.0权限适配及兼容库的实现

    摘要:普通权限不会泄露用户隐私,同时也不会导致手机安全问题。最后附上及第三方库链接权限兼容库作者看书的小蜗牛原文链接权限适配及兼容库的实现参考文档权限适配之卡写入 从6.0 MarshMallow开始,Android支持动态权限管理,即有些权限需要在使用到的时候动态申请,根据用户的选择需要有不同的处理,具体表现可以看下图: showImg(https://segmentfault.com/i...

    My_Oh_My 评论0 收藏0
  • Android具箱文件目录

    摘要:这是一个系列,我们将其命名为工具箱,如果你还没有看之前的文章工具箱之解析工具箱之组织你的代码文件工具箱之理解资源文件工具箱之生命周期工具箱之迁移到工具箱之权限管理开发一个项目的结构最经常使用的文件夹如下源代码目录包括活动的控制器模型帮助类 这是一个系列,我们将其命名为工具箱,如果你还没有看之前的文章: Android工具箱之Context解析 Android工具箱之组织你的代码文件 A...

    Alliot 评论0 收藏0

发表评论

0条评论

jeffrey_up

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<