Android6.0权限管理-PermissionsDispatcher
请查看我的个人网站
新的运行时权限仅当我们设置targetSdkVersion to 23才起作用,app在6.0之前的设备依然使用旧的权限系统。
权限组列表:
Permission Group | Permissions |
---|---|
android.permission-group.CALENDAR
|
|
android.permission-group.CAMERA
|
|
android.permission-group.CONTACTS
|
|
android.permission-group.LOCATION
|
|
android.permission-group.MICROPHONE
|
|
android.permission-group.PHONE
|
|
android.permission-group.SENSORS
|
|
android.permission-group.SMS
|
|
android.permission-group.STORAGE
|
|
当用户安装或更新应用时,系统将授予应用所请求的属于 PROTECTION_NORMAL 的所有权限(安装时授权的一类基本权限)。这类权限包括:
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
只需要在AndroidManifest.xml中简单声明这些权限就好,安装时就授权。不需要每次使用时都检查权限,而且用户不能取消以上授权。
Annotation | Required | Description |
---|---|---|
@RuntimePermissions
|
✓ |
Register an Activity or Fragment to handle permissions/
|
@NeedsPermission
|
✓ |
Annotate a method which performs the action that requires one or more permissions/
|
@OnShowRationale
|
Annotate a method which explains why the permission/s is/are needed. It passes in a PermissionRequest object which can be used to continue or abort the current permission request upon user input/
|
|
@OnPermissionDenied
|
Annotate a method which is invoked if the user doesn't grant the permissions/
|
|
@OnNeverAskAgain
|
Annotate a method which is invoked if the user chose to have the device "never ask again" about a permission/
|
|
@RuntimePermissions public class MainActivity extends AppCompatActivity implements Runnable{ @NeedsPermission(Manifest.permission.READ_EXTERNAL_STORAGE) void doACacheNeedsPermission() { //处理当用户允许该权限时需要处理的方法 } @OnShowRationale(Manifest.permission.READ_EXTERNAL_STORAGE) void ACacheShowRationale(PermissionRequest request) { request.proceed(); // 提示用户权限使用的对话框 } @OnNeverAskAgain(Manifest.permission.READ_EXTERNAL_STORAGE) void ACacheOnNeverAskAgain() { Toast.makeText(this, "ACacheOnNeverAskAgain, Toast.LENGTH_SHORT).show(); } /** * 如果用户拒绝该权限执行的方法 */ @OnPermissionDenied(Manifest.permission.READ_EXTERNAL_STORAGE) void ACacheOnPermissionDenied() { Toast.makeText(this, "ACacheOnPermissionDenied", Toast.LENGTH_SHORT).show(); } /** * 权限请求回调,提示用户之后,用户点击“允许”或者“拒绝”之后调用此方法 * @param requestCode 定义的权限编码 * @param permissions 权限名称 * @param grantResults 允许/拒绝 */ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults); } }
我们看到了该Activity继承了AppCompatActivity,是的,如果使用PermissionsDispatcher进行权限管理,那么Activity就要继承AppCompatActivity。这就要使用到了兼容包里的类了。同样此时相应Activity中使用的主题,也需要进行修改,修改成相应兼容包里的主题。
那么我们来看看MainActivityPermissionsDispatcher类中是如何实现权限管理的,默认是没有此类的,需要编译下才会有此类。
final class MainActivityPermissionsDispatcher { //定义的权限编码,当PERMISSION_DOACACHENEEDSPERMISSION有N个权限,那么REQUEST_DOACACHENEEDSPERMISSION就会有多少值 private static final int REQUEST_DOACACHENEEDSPERMISSION = 1; //需要请求的权限名称 private static final String[] PERMISSION_DOACACHENEEDSPERMISSION = new String[] {"android.permission.READ_EXTERNAL_STORAGE"}; private MainActivityPermissionsDispatcher() { } /** * 检查用户设备是否拥有该权限 * @param target */ static void doACacheNeedsPermissionWithCheck(MainActivity target) { // 如果拥有该权限,那么调用用户注解为:@NeedsPermission的方法 if (PermissionUtils.hasSelfPermissions(target, PERMISSION_DOACACHENEEDSPERMISSION)) { target.doACacheNeedsPermission(); } else { // 如果用户设备没有该权限,那么请求提示用户是否赋予该权限 if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_DOACACHENEEDSPERMISSION)) { target.ACacheShowRationale(new DoACacheNeedsPermissionPermissionRequest(target)); } else { ActivityCompat.requestPermissions(target, PERMISSION_DOACACHENEEDSPERMISSION, REQUEST_DOACACHENEEDSPERMISSION); } } } /** * 权限请求回调 * @param target * @param requestCode 权限编码 * @param grantResults */ static void onRequestPermissionsResult(MainActivity target, int requestCode, int[] grantResults) { switch (requestCode) { case REQUEST_DOACACHENEEDSPERMISSION: if (PermissionUtils.getTargetSdkVersion(target) < 23 && !PermissionUtils.hasSelfPermissions(target, PERMISSION_DOACACHENEEDSPERMISSION)) { target.ACacheOnPermissionDenied(); return; } if (PermissionUtils.verifyPermissions(grantResults)) { target.doACacheNeedsPermission(); } else { if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_DOACACHENEEDSPERMISSION)) { target.ACacheOnNeverAskAgain(); } else { target.ACacheOnPermissionDenied(); } } break; default: break; } } private static final class DoACacheNeedsPermissionPermissionRequest implements PermissionRequest { private final WeakReference<MainActivity> weakTarget; private DoACacheNeedsPermissionPermissionRequest(MainActivity target) { this.weakTarget = new WeakReference<>(target); } @Override public void proceed() { MainActivity target = weakTarget.get(); if (target == null) return; ActivityCompat.requestPermissions(target, PERMISSION_DOACACHENEEDSPERMISSION, REQUEST_DOACACHENEEDSPERMISSION); } @Override public void cancel() { MainActivity target = weakTarget.get(); if (target == null) return; target.ACacheOnPermissionDenied(); } } }
那么如果需要使用PermissionsDispatcher,需要在project的 build.gradle中添加
buildscript { dependencies { classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' } }
然后在app module中的build.gradle中添加:(必须在app module中添加)
apply plugin: 'android-apt' dependencies { compile 'com.github.hotchemi:permissionsdispatcher:${latest.version}' apt 'com.github.hotchemi:permissionsdispatcher-processor:${latest.version}' }
目前 ${latest.version}
最新的是2.0.8。
最后奉上该库的github地址:https://github.com/hotchemi/PermissionsDispatcher
好了,PermissionsDispatcher的使用基本如此。希望可以帮助到大家,如果有不对的地方还望提出。
Android6.0权限管理-PermissionsDispatcher相关推荐
- android拍照所需的权限,eclipse --- Android拍照,相册选择图片以及Android6.0权限管理...
[实例简介] eclipse --- Android拍照,相册选择图片以及Android6.0权限管理 [实例截图] [核心代码] camreainandroidm └── camreainandro ...
- android关闭权限管理,Android6.0权限管理以及使用权限该注意的地方
Android 6.0 Marshmallow首次增加了执行时权限管理,这对用户来说,能够更好的了解.控 制 app 涉及到的权限.然而对开发人员来说却是一件比較蛋疼的事情.须要兼容适配,并保证程序功 ...
- android6.0权限管理工具EasyPermissionUtil
前言 android6.0開始,权限的申请发生了改变,申请变的动态化,也就是执行时权限,和iOS相仿,动态化的意思是指,在每次使用须要危急权限的方法的时候.须要检查程序是否获得了该权限的许可.动态化的 ...
- Android M Android6.0 权限管理 EasyPermission Demo
https://github.com/louisgeek/LouisEasyPermission
- Android6.0权限大全和权限分类
自从出了Android6.0权限管理之后,再也不能像以前那样粘贴复制了,必须认识权限了,所以总结一下方便以后自己使用. 一.所有权限 访问登记属性 android.permission.ACCESS_ ...
- android 7.0 自启管理,一款不错的android6.0、7.0权限管理器推荐
一款不错的android6.0.7.0权限管理器PermissionsCheckerUtil 初始化权限管理器:构造方法 private final Context mContext; public ...
- Android6.0权限适配及兼容库的实现
从6.0 MarshMallow开始,Android支持动态权限管理,即有些权限需要在使用到的时候动态申请,根据用户的选择需要有不同的处理,具体表现可以看下图: 本文并不关心权限适配的原理,原理可以参 ...
- android 6.0 短信权限,Android6.0权限适配
Code4Android .jpg 前言 现在谈论Android权限适配可能有点没必要,因为网上关于权限适配的文章很多,搜一下Android6.0权限适配关键词能搜到一堆文章,而且很多写的还很不错.不 ...
- Android6.0M权限管理实战,完美轻量级封装
Android6.0M权限管理实战,完美轻量级封装 随着Android版本的不断更新,Google的Android开发人员也想到了Android应用在权限管理方面的各种问题,让好多用户摸不着头脑就使用 ...
最新文章
- selenium切换窗口 java_WebDriver(Selenium2) 根据新窗口title切换窗口
- 【渝粤题库】陕西师范大学200481 高级英语(一)
- Asp.net mvc自定义route实现国际化
- Programming Computer Vision with Python【学习笔记】【第一章】
- Python 3.8.3 发布
- linux复制duo文件,Linux打印目录下多个文件
- 简书 c语言 指针,C语言-指针
- python 对象(一分钟读懂)03
- 谷歌停止中国版搜索引擎;李楠宣布离职魅族;微软用 Rust 替代 C/C++ | 极客头条...
- 切换回Chrome上的上次标签及打开设置快捷键
- vue获取豆瓣图片资源,数据接口正常,图片无法显示,按右键能正常显示
- IDM chrome插件找不到
- ubuntu14.04安装Java jdk/jdr虚拟机
- python合并excel工作簿_使用python将excel工作簿工作表合并为一个工作表
- MES生产管理系统中,看板管理究竟是什么
- 批量!使用ArcGIS python 批量修改遥感影像名
- golang设计模式——结构模式
- The authenticity of host 'localhost (127.0.0.1)' can't be established的处理方法
- 计算机初级证书 英语怎么说,常见职业资格证书英文翻译(含英语、计算机等)...
- 怎么辨别一个公司是不是外包?