博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PermissionsDispatcher,Android 6.0 运行时权限
阅读量:6244 次
发布时间:2019-06-22

本文共 5187 字,大约阅读时间需要 17 分钟。

hot3.png

运行时权限

从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。

系统权限分为两类:

  • 正常权限:只需在你应用的 Androidmanifest.xml 中列出,安装时授权。
  • 危险权限:需要在你应用的 Androidmanifest.xml 中列出,并在运行时授权。

如需了解更多关于正常权限与危险权限可以参阅。

关于 Android 6.0 运行时权限的详细讲解可以看和。

运行时权限的加入增加了用户隐私的安全,但同时也给开发者带来了一些负担,因为多了检查权限,请求权限,处理权限请求响应的步骤。

于是就出现了一些框架,用于简化运行时权限的处理,如 ,,, 等。

这里只用过 easypermissions 和 PermissionsDispatcher,最终选择了 PermissionsDispatcher,原因是使用人数最多,api 设计简单易用,兼容性较好,easypermissions 使用起来相对麻烦一些。

PermissionsDispatcher

PermissionsDispatcher 提供简单的基于注解的 api 处理 Android Marshmallow 下的运行时权限(非反射方式)。

项目地址:

一. 集成说明

注意把 ${latest.version} 改为。

打开命令行,cd 到工程根目录,执行 gradlew -version 或者 gradlew -v 命令查看当前工程 gradle 版本。

根据 gradle 版本进行如下配置:

Android Gradle Plugin >= 2.2

在 app 模块下的 build.gradle 添加下面的配置:

dependencies {  compile 'com.github.hotchemi:permissionsdispatcher:${latest.version}'  annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:${latest.version}'}

Android Gradle Plugin < 2.2

在 project-level 下的 build.gradle 添加下面配置:

buildscript {  dependencies {    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'  }}

然后,在 app 模块下的 build.gradle 添加下面配置:

apply plugin: 'android-apt'dependencies {  compile 'com.github.hotchemi:permissionsdispatcher:${latest.version}'  apt 'com.github.hotchemi:permissionsdispatcher-processor:${latest.version}'}

二. 使用说明

1. 添加注解

注意:注解的方法不能是 private 的。

相关注解说明

注解 是否必须 描述
@RuntimePermissions 注册一个 ActivityFragment 用于处理权限
@NeedsPermission 注解一个方法,说明需要什么权限(一个或多个)
@OnShowRationale   注解一个方法,解释为什么需要这些权限
@OnPermissionDenied   注解一个方法,当用户拒绝授权时将调用该方法
@OnNeverAskAgain   注解一个方法,当用户选择了 "不再提醒" 将调用该方法

示例代码

@RuntimePermissions public class MainActivity extends AppCompatActivity {    // 单个权限    // @NeedsPermission(Manifest.permission.CAMERA)    // 多个权限    @NeedsPermission({ Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO })    void showCamera() {        getSupportFragmentManager().beginTransaction()                .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())                .addToBackStack("camera")                .commitAllowingStateLoss();    }        // 向用户说明为什么需要这些权限(可选)    @OnShowRationale(Manifest.permission.CAMERA)    void showRationaleForCamera(final PermissionRequest request) {        new AlertDialog.Builder(this)            .setMessage(R.string.permission_camera_rationale)            .setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed())            .setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel())            .show();    }    // 用户拒绝授权回调(可选)    @OnPermissionDenied(Manifest.permission.CAMERA)    void showDeniedForCamera() {        Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show();    }    // 用户勾选了“不再提醒”时调用(可选)    @OnNeverAskAgain(Manifest.permission.CAMERA)    void showNeverAskForCamera() {        Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show();    }}

2. 调用自动生成的辅助类

注解写好后,Build ——> Make Module ***PermissionsDispatcher 会生成一个 MainActivityPermissionsDispatcher(Activity Name + PermissionsDispatcher),你可以使用它来安全地访问这些受权限保护的方法。

你唯一需要做的一件事是将工作委托给这个辅助类:

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    findViewById(R.id.button_camera).setOnClickListener(v -> {      // 调用带权限检查的 showCamera 方法      MainActivityPermissionsDispatcher.showCameraWithCheck(this);    });}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);    // 代理权限处理到自动生成的方法    MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);}

*PermissionDispatcher.*WithCheck 方法对你原来的方法进行了包装,包了一层权限检查的代码,你需要做的就是把原来的方法调用改为 *PermissionDispatcher.*WithCheck。另外,在 onRequestPermissionsResult 中回调 *PermissionsDispatcher.onRequestPermissionsResult 方法。

三. 获取特殊权限

两个特殊权限:

  • Manifest.permission.SYSTEM_ALERT_WINDOW:显示悬浮窗
  • Manifest.permission.WRITE_SETTINGS:读写系统设置

对于这两个权限,在 Android 下默认是需要到 Settings -> Apps 中手动授权的。由于不同 ROM 情况可能还有点不一样。

PermissionsDispatcher 对于两个特殊权限也做了兼容处理(Android6.0+),使用方法如上一样。

如果需要兼容低版本的 Android 系统或者不同 ROM 可以参考。

四. maxSdkVersion

有一个 maxSdkVersion 属性,PermissionsDispatcher 对它也做了支持。

比如,在 Androidmanifest.xml 中定义了如下权限:

注解中添加 maxSdkVersion

@RuntimePermissionspublic class MainActivity extends AppCompatActivity {    @NeedsPermission(value = Manifest.permission.WRITE_EXTERNAL_STORAGE, maxSdkVersion = 18)    void getStorage() {        // ...    }    }

PermissionsDispatcher Plugin

PermissionsDispatcher Plugin 是 PermissionsDispatcher 的辅助插件,支持自动生成权限检查相关代码。

项目地址:

安装说明:Android Studio 中打开 Setting,Plugins ——> Browse repositories... 搜索 PermissionsDispatcher plugin,点 Install 下载安装,安装完成后重启生效。

image

使用说明:

  1. 在 Activity/Fragment 中,Generate -> Generate Runtime Permissions...
  2. 选择权限并为每个注解输入方法名
  3. 点击 Generate ,完成

使用过程中发现有两个小问题需要注意一下:

  1. 多次生成代码,onRequestPermissionsResult 方法也会被自动添加多次
  2. 代码生成后会提示你是否 rebuild 工程,建议选择取消,Build ——> Make Module *** 相对快些

作者:linchaolong
链接:https://www.jianshu.com/p/64e7334cde11
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://my.oschina.net/sfshine/blog/2998678

你可能感兴趣的文章
Java基础-- ==号与equals()方法的区别
查看>>
VARCHART XGantt实践:兼顾清晰和细节的排列优化
查看>>
小程序实现人脸识别功能
查看>>
Flora图像风格迁移App
查看>>
常用数组方法梳理
查看>>
JavaScript(4)之——前端模块化
查看>>
数字图像处理----图像旋转
查看>>
iOS 报错 Library not found lPods AFNetworking
查看>>
Spark性能优化:数据本地化优化
查看>>
Java中几个常用类介绍
查看>>
程序员为什么要高薪?看完让你勇于为自己开价
查看>>
(八)spring cloud微服务分布式云架构- Spring Cloud 组件和概念介绍
查看>>
由 Tagged Pointer 联想到的一个问题
查看>>
Python代理IP爬虫的简单使用
查看>>
KVO探索
查看>>
前端错误与捕获
查看>>
玩一玩颜值测试
查看>>
动画和flex布局
查看>>
CSS布局
查看>>
第一篇:SpringBoot 2 x 构建工程
查看>>