关于Android M(6.0)新的授权方式
只有我们设置app的targetSdkVersion为23,并且app运行在6.0之后的设备才使用新的权限系统。
在Android6.0,app不会在安装时授予权限,而是在app运行时一个一个询问用户授予权限。
权限询问对话框不会自己弹出来,开发者必须自己调用。如果我们调用一些函数需要某权限而用户拒绝授权,函数就抛出异常直接导致程序崩溃。
Android6.0用户可以随时在设置里取消已经授权的权限。
Android6.0权限的分类
Android6.0分了几种权限:Normal Permissions(安装时自动授权,用户也不能取消权限) 和 Dangerous Permissions
Dangerous Permissions 就是我们必须手动申请的那种。后面会有具体的介绍。
权限组的概念
同一组的任何一个权限被授权了,其他权限也自动被授权。例如:一旦WRITE_CONTACTS被授权了,app也有READ_CONTACTS和GET_ACCONTS了。
以下是权限和权限组:
普通权限
只需要在AndroidManifest.xml中简单声明这些权限就好,安装时就授权。不需要每次使用时都检查权限,而且用户不能取消以下授权。
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
PermissonM介绍
PermissionM下有4个类 管理类,工具类和监听器
可以判断以下几种情况:调用的方法已经被授权,直接调用;还没被授权,申请用户授权;用户拒绝授权,再次申请授权
@@PermissionM的使用
在6.0下我们要调用必须需要用到权限的方法时可以用PermissionM,只需4步
在清单文件注册你要用的权限
new 一个权限监听器
在调用方法前,调用checkPermissions查看你要申请的方法是否被授权
接受权限授权结果的回调结果并处理
PermissionM代码示例(PermissionsDemo)
- 在MainActivity中先new一个AbstractPermissionMListener权限监听器
有三个回调方法:
- onPermissionsGranted():这个方法在你申请的所有方法都获得授权时调用;
- onPermissionsDenied():这个方法在你申请的权限数组里有一个或者多个权限没有获得授权时调用;
- onShowRequestPermissionRationale():这个方法在用户拒绝授权后再次点击时调用;
用户点击“调用照相机”触发showCamera方法 ,这时我们开始检查权限
- 调用PermissionsMDispatcher.checkPermissions()方法,注意最后一个参数如果一次需要申请多个权限就传数组,其实申请一个权限也放数组里就行
一定要注意接收系统的回调!!
- 重写系统的onRequestPermissionsResult()方法,调用管理类的onRequestPermissionsResult()方法,这里还要传监听器,因为逻辑的判断都写在监听器的回调方法里了
如果获得了用户的授权,接下来就可以调用我们想用的方法了,方法要写在获得权限成功的onPermissionsGranted()方法里
如果用户拒绝授权,可以给用户一个响应
如果用户拒绝授权又点击了,就回调onShowRequestPermissionRationale(),demo里我弹出个snackbar告诉用户我为什么需要用到这个权限,然后可以继续请求授权
如果用户真的不想授权勾选了“不再提示我”,那么以后再点击就回调onPermissionsDenied()了