Android(安卓)6.0权限动态申请适配
16lz
2021-01-26
Android 6.0权限动态申请适配
最近发现应用的相关权限申请失败,导致出现了不好的用户体验。然后就然后你懂的,做了一波6.0及以上版本的动态权限的适配。
虽然很简单,还是记录下。
从Android的6.0版本(API是23)开始,用户开始运行应用时动态获取应用所需的权限,这样增加了app的安全性,增加了用户的不方便,需要手动,或者弹框确定权限申请。6.0以下默认获取Mainifest中申请的权限。Android的权限分为敏感和正常的权限。
Normal Permissions:ACCESS_LOCATION_EXTRA_COMMANDSACCESS_NETWORK_STATEACCESS_NOTIFICATION_POLICYACCESS_WIFI_STATEBLUETOOTHBLUETOOTH_ADMINBROADCAST_STICKYCHANGE_NETWORK_STATECHANGE_WIFI_MULTICAST_STATECHANGE_WIFI_STATEDISABLE_KEYGUARDEXPAND_STATUS_BARGET_PACKAGE_SIZEINSTALL_SHORTCUTINTERNETKILL_BACKGROUND_PROCESSESMODIFY_AUDIO_SETTINGSNFCREAD_SYNC_SETTINGSREAD_SYNC_STATSRECEIVE_BOOT_COMPLETEDREORDER_TASKSREQUEST_INSTALL_PACKAGESSET_ALARMSET_TIME_ZONESET_WALLPAPERSET_WALLPAPER_HINTSTRANSMIT_IRUNINSTALL_SHORTCUTUSE_FINGERPRINTVIBRATEWAKE_LOCKWRITE_SYNC_SETTINGS
Dangerous Permissions:group:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTSgroup:android.permission-group.PHONE permission:android.permission.READ_CALL_LOG permission:android.permission.READ_PHONE_STATE permission:android.permission.CALL_PHONE permission:android.permission.WRITE_CALL_LOG permission:android.permission.USE_SIP permission:android.permission.PROCESS_OUTGOING_CALLS permission:com.android.voicemail.permission.ADD_VOICEMAILgroup:android.permission-group.CALENDAR permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDARgroup:android.permission-group.CAMERA permission:android.permission.CAMERAgroup:android.permission-group.SENSORS permission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATION permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGE permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONE permission:android.permission.RECORD_AUDIOgroup:android.permission-group.SMS permission:android.permission.READ_SMS permission:android.permission.RECEIVE_WAP_PUSH permission:android.permission.RECEIVE_MMS permission:android.permission.RECEIVE_SMS permission:android.permission.SEND_SMS permission:android.permission.READ_CELL_BROADCASTS
敏感的权限是需要我们去动态申请的,当然是Android 6.0以上的版本哦。权限分为以上的组合,默认申请组中的一个权限,就可以获取到同一个组下的所有权限。具体可以参考android.Manifest.permission的类。
下面讲下具体的方法
1.判断当前是否有相应的权限
//检测权限是否申请通过public boolean checkPermissionHave(String permission) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { return true; } boolean isHave = ContextCompat.checkSelfPermission(mActivity, permission) == PackageManager.PERMISSION_GRANTED; return isHave;}
2.申请相应的权限
//申请单个权限 responseCode Activity.onRequestPermissionsResult的返回断//responseCode是activity中的返回对应的codepublic void requesSinglePermission(String permission, int responseCode) { if (mActivity == null || TextUtils.isEmpty(permission)) { return; } //判断当前系统是否高于或等于6.0 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { return; } if (ContextCompat.checkSelfPermission(mActivity, permission) == PackageManager.PERMISSION_GRANTED) { //有相应的权限 } else { //进行权限申请 ActivityCompat.requestPermissions(mActivity, new String[]{permission}, responseCode); }}
3.申请权限的返回处理
//activity的自带方法public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //判断相关的权限是否获取到了,做下一步处理}
4.判断当前的申请权限是否会弹系统的权限框
//检测申请权限是否会弹框public boolean checkShowRequestDialog(String permission) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { return false; } if(TextUtils.isEmpty(permission)){ return true; } boolean isShowRequestDialog = ActivityCompat.shouldShowRequestPermissionRationale(mActivity, permission); return isShowRequestDialog;}
Tips:系统权限框展示后,用户点击关闭,选择永不提示。下一次的就不会弹出权限的申请框。这边需要独立处理
5.跳转到应用的设置页面,其他的自行处理
//跳转设置页面 public void goToSetting(int returnCode) { Intent mIntent = new Intent();// mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { mIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); mIntent.setData(Uri.fromParts("package", mActivity.getPackageName(), null)); } else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) { mIntent.setAction(Intent.ACTION_VIEW); mIntent.setClassName("com.android.settings", "com.android.setting.InstalledAppDetails"); mIntent.putExtra("com.android.settings.ApplicationPkgName", mActivity.getPackageName()); } mActivity.startActivityForResult(mIntent,returnCode); }
是不是非常的简单,so easy,ok,打完收工,希望对大家有所帮助
更多相关文章
- TTF字体库系列文章1 —— Android使用ttf字体库替代替图片(iconf
- Android开发过程遇到的安装好的APP打开程序崩溃,或者安装后应用列
- Android(安卓)百度地图—反地理编码—获取当前位置附近的大厦楼
- 一个Demo学完Android中所有的服务
- android 关于屏幕截屏的几种办法
- android 打开文件的Intent及使用
- Android(安卓)自动填写验证码
- android 获取经纬度
- Android后门GhostCtrl,完美控制设备任意权限并窃取用户数据