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,打完收工,希望对大家有所帮助

更多相关文章

  1. TTF字体库系列文章1 —— Android使用ttf字体库替代替图片(iconf
  2. Android开发过程遇到的安装好的APP打开程序崩溃,或者安装后应用列
  3. Android(安卓)百度地图—反地理编码—获取当前位置附近的大厦楼
  4. 一个Demo学完Android中所有的服务
  5. android 关于屏幕截屏的几种办法
  6. android 打开文件的Intent及使用
  7. Android(安卓)自动填写验证码
  8. android 获取经纬度
  9. Android后门GhostCtrl,完美控制设备任意权限并窃取用户数据

随机推荐

  1. MYSQL字符串强转的方法示例
  2. MySQL 慢查询日志的开启与配置
  3. Navicat Premium远程连接MySQL数据库的方
  4. MySQL decimal unsigned更新负数转化为0
  5. Mysql匿名登录无法创建数据库问题解决方
  6. MySQL排序原理和案例详析
  7. linux下利用Docker安装mysql的步骤
  8. 详解mysql中的字符集和校验规则
  9. MySQL 中行转列的方法
  10. MySQL 字符类型大小写敏感