Android M运行时权限是个啥东西
啥是运行时权限呢?Android M对权限管理系统进行了改版,之前我们的App需要权限,只需在manifest中申明即可,用户安装后,一切申明的权限都可来去自如的使用。但是Android M把权限管理做了加强处理,在manifest申明了,在使用到相关功能时,还需重新授权方可使用。当然,不是所有权限都需重新授权,所以就把这些需要重新授权方可使用的权限称之为运行时权限。
运行时权限的影响
运行时权限的好处可以让用户使用时更有主动权,不会让app随便乱来。 但是受害最深的却是我们这些受苦受难的开发者,为何这么说呢?如果你的app的targetSdkVersion 是23也就是android 6.0的话,遇到运行时权限不去做代码处理的话,程序直接崩掉。
所以,如果你的app没有在android 6.0上做足够的测试,请不要设置targetSdk为23,22以下就不会出现问题。 但是,作为开发者,我们还是必须要与时俱进的不是,而且以后的主流机型也必然是android M,怎么能不去适配他/她呢?继续往下看。
哪些是运行时权限
要先做好适配,那就必然要先了解哪些是运行时权限。 先看下哪些是不用特殊处理的权限,android称之为普通权限: 参考链接:http://developer.android.com/guide/topics/security/normal-permissions.html As of API level 23, the following permissions are classified as 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
再看下运行时权限,android称之为危险权限(google还对其分了组): 参考链接:http://developer.android.com/guide/topics/security/permissions.html#normal-dangerous
危险权限表
同一组的任何一个权限被授权了,其他权限也自动被授权。例如,一旦WRITE_CONTACTS被授权了,app也有READ_CONTACTS和GET_ACCOUNTS了。
------------------------------ 关键部分来了---------------------------------------------
代码封装
目前对运行时权限,github上也有些代码封装库,但是都感觉用起来太麻烦,于是自己动手封装了下: 参考代码(google写的sample): https://github.com/googlesamples/android-RuntimePermissions; http://developer.android.com/training/permissions/requesting.html
封装代码如下:
在BaseActivity添加如下代码:
Tips:
1)BaseActivity要继承AppCompatActivity 2)support包使用尽量新的,我使用的是compile 'com.android.support:appcompat-v7:23.0.1' 以防里面的ActivityCompat找不到相关类或方法。 3)如果在Fragment中使用,直接在自己的BaseFragment写个方法调用此Activity的方法即可。
一句代码使用:
比如,我们要请求相机:
performCodeWithPermission("XX App请求访问相机权限",new BaseAppCompatActivity.PermissionCallback() { @Override public void hasPermission() {
写在最后
- 如果读者还是没有看过文章开头推荐的文章,建议先看一遍,有些知识和出现问题的场景此文没有细说,看完后对运行时权限会有更好的理解。
- 另外,如果本文有描述不对之处,还望大家多多指正,多谢!
===20160509更新========
checkSelfPermission检测权限失效问题
要改成如下的检测方案: 参考:http://stackoverflow.com/questions/33407250/checkselfpermission-method-is-not-working-in-targetsdkversion-22
public boolean selfPermissionGranted(String permission) {
获取target sdk的方法如下:
try { final PackageInfo info = context.getPackageManager().getPackageInfo( context.getPackageName(), 0); targetSdkVersion = info.applicationInfo.targetSdkVersion; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }
官方解决方案 EasyPermissions
google自己出了一个解决方案,在github上叫easypermissions。 链接为:https://github.com/googlesamples/easypermissions
文/Adley(简书作者)
原文链接:http://www.jianshu.com/p/d3a998ec04ad
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
|