关于Android 6.0运行时权限的一些理解和权限处理的三方库的应用
2017-03-30 13:16
567 查看
运行时权限:就是在手机运行中需要运用到什么权限就去申请授权什么权限;
这个是从Android 6.0出来的,在以往的Android版本里,权限只是在第一次安装的时候一次性全部授权,这就导致很多app一次申请n多个权限,私下里偷偷不知道在你手机里干什么,说不定你的艳照就被被人获取到了,基于这些个安全的考虑,所以推出了运行时权限这一说
当然,也不是所有权限都需要在运行的时候去申请授权,有些不涉及到隐私等常用的权限就不需要去动态授权了,所以新的权限策略就把权限分为了普通权限和危险权限;
普通权限:这类权限还是只需要在manifast去声明就行了,在app安装的时候直接授权,不需要去检测它们是否授权,以下就是普通权限:
危险权限:APP运行在Android 6.0 (API level 23)或以上的设备中,并且你的Android Studio的app下的build.gradle里面的targetSdkVersion>=23时
此时系统就会采取新的运行时权限策略了,需要危险权限的时候,如果没有做相应的处理app就会崩溃,这tm事情就大了!以下就是危险权限:
当你需要使用危险权限的时候你就需要注意了:
1.这些个权限你还是需要在manifast里面去申明
2.同一个权限组的任何一个权限被授权了,这个权限组的其他权限也自动被授权。(从上面的危险权限中可以看出他们有时候是组队出现的)
3.申请权限的弹出框是组队出现的,例如我申请READ_EXTERNAL_STORAGE,系统会提示”允许xxx访问设备上的照片、媒体内容和文件吗?”。
4.如果app运行在Android 6.0及以上,但是你的Android Studio targetSdkVersion<23时,系统还是会按照老的权限策略去执行,即还是在安装的时候去申请所有权限。
具体的实现步骤
1.你需要的危险权限在manifast里面申明,如下:
2.在你需要用到这个权限的地方去检测用户是否授权过这个权限,具体如下:
3,如果没有授权就有这一步,没有就要去申请了,具体申请如下:
4,用户到底是授权了还是拒绝了呢?这里就需要重写onRequestPermissionsResult方法,在此方法里面去获取了,具体如下:
相比自己写,我还是更愿意用别人封装好的,嘿嘿嘿,下面介绍2个大佬封装好的拿来用
1,PermissionGen
github地址:https://github.com/lovedise/PermissionGen
用法
0,添加依赖:compile ‘com.lovedise:permissiongen:0.0.6’
1,在manifast里面去申明
2,在需要用到的地方申请
或者一个:
3,重写onRequestPermissionsResult
4,处理授权和拒绝了,注解上面的requsetCode一定要是你申请的时候写的
是不是感觉还是很麻烦啊,我也觉得,下面来一个更简单的
2,RxPermissions
github地址:https://github.com/tbruyelle/RxPermissions
这个是从Android 6.0出来的,在以往的Android版本里,权限只是在第一次安装的时候一次性全部授权,这就导致很多app一次申请n多个权限,私下里偷偷不知道在你手机里干什么,说不定你的艳照就被被人获取到了,基于这些个安全的考虑,所以推出了运行时权限这一说
当然,也不是所有权限都需要在运行的时候去申请授权,有些不涉及到隐私等常用的权限就不需要去动态授权了,所以新的权限策略就把权限分为了普通权限和危险权限;
普通权限:这类权限还是只需要在manifast去声明就行了,在app安装的时候直接授权,不需要去检测它们是否授权,以下就是普通权限:
ACCESS_LOCATION_EXTRA_COMMANDS ACCESS_NETWORK_STATE ACCESS_NOTIFICATION_POLICY ACCESS_WIFI_STATE BLUETOOTH BLUETOOTH_ADMIN BROADCAST_STICKY CHANGE_NETWORK_STATE CHANGE_WIFI_MULTICAST_STATE CHANGE_WIFI_STATE DISABLE_KEYGUARD EXPAND_STATUS_BAR GET_PACKAGE_SIZE INSTALL_SHORTCUT INTERNET KILL_BACKGROUND_PROCESSES MODIFY_AUDIO_SETTINGS NFC READ_SYNC_SETTINGS READ_SYNC_STATS RECEIVE_BOOT_COMPLETED REORDER_TASKS REQUEST_IGNORE_BATTERY_OPTIMIZATIONS REQUEST_INSTALL_PACKAGES SET_ALARM SET_TIME_ZONE SET_WALLPAPER SET_WALLPAPER_HINTS TRANSMIT_IR UNINSTALL_SHORTCUT USE_FINGERPRINT VIBRATE WAKE_LOCK WRITE_SYNC_SETTINGS
危险权限:APP运行在Android 6.0 (API level 23)或以上的设备中,并且你的Android Studio的app下的build.gradle里面的targetSdkVersion>=23时
此时系统就会采取新的运行时权限策略了,需要危险权限的时候,如果没有做相应的处理app就会崩溃,这tm事情就大了!以下就是危险权限:
CALENDAR(日历) READ_CALENDAR WRITE_CALENDAR CAMERA(相机) CAMERA CONTACTS(联系人) READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS LOCATION(位置) ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION MICROPHONE(麦克风) RECORD_AUDIO PHONE(手机) READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS SENSORS(传感器) BODY_SENSORS SMS(短信) SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS STORAGE(存储卡) READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE
当你需要使用危险权限的时候你就需要注意了:
1.这些个权限你还是需要在manifast里面去申明
2.同一个权限组的任何一个权限被授权了,这个权限组的其他权限也自动被授权。(从上面的危险权限中可以看出他们有时候是组队出现的)
3.申请权限的弹出框是组队出现的,例如我申请READ_EXTERNAL_STORAGE,系统会提示”允许xxx访问设备上的照片、媒体内容和文件吗?”。
4.如果app运行在Android 6.0及以上,但是你的Android Studio targetSdkVersion<23时,系统还是会按照老的权限策略去执行,即还是在安装的时候去申请所有权限。
具体的实现步骤
1.你需要的危险权限在manifast里面申明,如下:
<uses-permission android:name="android.permission.CALL_PHONE" />
2.在你需要用到这个权限的地方去检测用户是否授权过这个权限,具体如下:
/** * 检查用户是否授权 CALL_PHONE 这个权限 * PackageManager.PERMISSION_GRANTED 表示用户已经授权 * PackageManager.PERMISSION_DENIED 表示用户已经拒绝或者还没有授权 */ if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { //表示用户已经授权该权限,接下来你想干嘛就干嘛了 } else { //表示还没授权,没有授权那就去申请啦 todoRequestPermission(); }
3,如果没有授权就有这一步,没有就要去申请了,具体申请如下:
/** * 用来申请 Manifest.permission.CALL_PHONE 这个权限的 */ private void todoRequestPermission() { /** * 需要3个参数 * 1,Activity * 2,申请权限的permissions数组,可以一次申请好几个权限,全部写在数组里面 * 3,请求码,用来区分是谁请求的,是哪个权限数组请求的 */ String[] permissions = {Manifest.permission.CALL_PHONE}; int requestCode = 1; ActivityCompat.requestPermissions(MainActivity.this,permissions,requestCode); }
4,用户到底是授权了还是拒绝了呢?这里就需要重写onRequestPermissionsResult方法,在此方法里面去获取了,具体如下:
/** * * @param requestCode 这个requestCode就是我们申请的时候填写的那货,不清楚请看上一步 * @param permissions 这个就是你申请的时候的权限数组,请看上一步 * @param grantResults 这个是你申请权限返回的授权结果,如果你申请了13个权限,那么这个里面就有13个结果 * 同意PackageManager.PERMISSION_GRANTED,拒绝PackageManager.PERMISSION_DENIED * 换句话说,就是放的这2货,和申请的权限数组是一一对应的 */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 1: /* 先判断一下这个申请结果数组的长度,我感觉判不判断都无所谓,因为只有你申请了权限,才会回掉这个方法 既然申请了,grantResults数组就不应该为空的 ,但是我看android大佬们都判断了,我一菜逼不判断,感觉 要被鄙视的节奏 */ if (grantResults.length>0) { //判断第一个请求结果是啥,同意:PERMISSION_GRANTED,拒绝:PERMISSION_DENIED if (grantResults[0] == PackageManager.PERMISSION_DENIED) { //拒绝了,你是个好人,我们不合适 } else { //同意了,可以去如家了,嘿嘿嘿~~~ } } break; } }
相比自己写,我还是更愿意用别人封装好的,嘿嘿嘿,下面介绍2个大佬封装好的拿来用
1,PermissionGen
github地址:https://github.com/lovedise/PermissionGen
用法
0,添加依赖:compile ‘com.lovedise:permissiongen:0.0.6’
1,在manifast里面去申明
2,在需要用到的地方申请
PermissionGen.with(MainActivity.this) .addRequestCode(100) .permissions( Manifest.permission.READ_CONTACTS, Manifest.permission.RECEIVE_SMS, Manifest.permission.WRITE_CONTACTS) .request();
或者一个:
PermissionGen.needPermission(this, 100, Manifest.permission.CAMERA);
3,重写onRequestPermissionsResult
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults); }
4,处理授权和拒绝了,注解上面的requsetCode一定要是你申请的时候写的
@PermissionSuccess(requestCode = 100) public void test() { //授权了 } @PermissionFail(requestCode = 100) private void test2() { //拒绝了 }
是不是感觉还是很麻烦啊,我也觉得,下面来一个更简单的
2,RxPermissions
github地址:https://github.com/tbruyelle/RxPermissions
相关文章推荐
- 关于Android23 及以上模拟器处理应用闪退的一些问题(权限相关)
- Android 6.0 运行时权限处理完全解析 及 三方库的使用
- Android 6.0 运行时权限处理
- Android 6.0 运行时权限处理
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限如何处理
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理
- Android 6.0 运行时权限处理完全解析
- android 6.0运行时权限应用之图库图片选取
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理解析
- Android 6.0 运行时权限处理完全解析