Android 6.0动态权限大总结

 

6.0动态权限这个问题,面试官很喜欢问这个。还有5.0、7.0新特性。
22以前的api,都是在AndroidManifest文件中注册权限即可,用户在安装apk的时候会有权限提示,但是哪个用户会看呢?google为了提高用户的安全性,在23(6.0)以后,app使用某一个敏感操作时,还需要用户的允许才行,否则这个功能无法使用。
动态权限就这么回事。

 

先贴一下我的工具类吧:

 


[java] view plain copy print?
/** 
 * @Author: duke 
 * @DateTime: 2017-03-30 15:51 
 * @Description: 权限检测工具类 
 */  
public class PermissionManager {  
  
    private PermissionManager() {  
    }  
  
    /** 
     * 是否需要动态申请权限 <br/> 
     * 
     * @return 需要:true,不需要:false 
     */  
    public static final boolean isNeedDynamicPermissions() {  
        //if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {}  
        if (Build.VERSION.SDK_INT >= 23) {  
            // 23 (Android 6.0)以上  
            return true;  
        }  
        return false;  
    }  
  
    /** 
     * 向用户弹出解释对话框 <br/> 
     * ******************************************************************************* 
     * ** 应用安装后第一次访问,直接返回false;                                     ** 
     * ** 第一次请求权限时用户拒绝了,下一次返回 true,                             ** 
     * ** 这时候可以显示一些为什么需要这个权限的说明;                              ** 
     * ** 第二次请求权限时,用户拒绝了,并选择了“不再提醒”的选项时,返回 false;  ** 
     * ** 设备的系统设置中禁止当前应用获取这个权限的授权,返回false;             ** 
     * ** 注意:第二次请求权限时,才会有“不再提醒”的选项,                        ** 
     * ** 如果用户一直拒绝,并没有选择“不再提醒”的选项,                          ** 
     * ** 下次请求权限时,会继续有“不再提醒”的选项,并且会一直返回true            ** 
     * ******************************************************************************* 
     * 
     * @param activity   上下文 
     * @param permission 需要提示解释的权限申请 
     * @return 需要提示:true,不需要:false 
     */  
    public static final boolean shouldShowRequestPermissionRationale(Activity activity, String permission) {  
        return ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);  
    }  
  
    /** 
     * 检查当前是否已被赋予权限 <br/> 
     * 
     * @param context     上下文 
     * @param permissions 待判断权限集合 
     * @return 授权:true,缺少授权:false 
     */  
    public static final boolean checkSelfPermission(Context context, String... permissions) {  
        if (null == permissions || permissions.length == 0) {  
            return false;  
        }  
        for (String permission : permissions) {  
            if (TextUtils.isEmpty(permission)) {  
                return false;  
            }  
            /** 
             * 检测权限核心方法 
             */  
            if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED) {  
                //如果其中某一个未授权  
                return false;  
            }  
        }  
        //权限参数合法,且全部都授权过  
        return true;  
    }  
  
    /** 
     * 正式请求用户授权 <br/> 
     * 
     * @param context     activity上下文 
     * @param permissions 待权限的权限集合 
     * @param requestCode 本次授权请求码 
     */  
    public static final void requestPermissions(Activity context, String[] permissions, int requestCode) {  
        ActivityCompat.requestPermissions(context, permissions, requestCode);  
    }  
  
    /** 
     * 检查授权结果,是否为“成功授权” <br/> 
     * 
     * @param grantResults 权限结果集合 
     * @return 授权成功:true,授权失败:false 
     */  
    public static final boolean checkPermissionsResult(int[] grantResults) {  
        if (grantResults == null || grantResults.length == 0) {  
            return false;  
        }  
        for (int grantResult : grantResults) {  
            if (grantResult == PackageManager.PERMISSION_DENIED) {  
                //其中一个未授权,立即返回false授权失败  
                return false;  
            }  
        }  
        return true;  
    }  
}  


/**
 * @Author: duke
 * @DateTime: 2017-03-30 15:51
 * @Description: 权限检测工具类
 */
public class PermissionManager {

    private PermissionManager() {
    }

    /**
     * 是否需要动态申请权限 <br/>
     *
     * @return 需要:true,不需要:false
     */
    public static final boolean isNeedDynamicPermissions() {
        //if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {}
        if (Build.VERSION.SDK_INT >= 23) {
            // 23 (Android 6.0)以上
            return true;
        }
        return false;
    }

    /**
     * 向用户弹出解释对话框 <br/>
     * *******************************************************************************
     * ** 应用安装后第一次访问,直接返回false;                                     **
     * ** 第一次请求权限时用户拒绝了,下一次返回 true,                             **
     * ** 这时候可以显示一些为什么需要这个权限的说明;                              **
     * ** 第二次请求权限时,用户拒绝了,并选择了“不再提醒”的选项时,返回 false;  **
     * ** 设备的系统设置中禁止当前应用获取这个权限的授权,返回false;             **
     * ** 注意:第二次请求权限时,才会有“不再提醒”的选项,                        **
     * ** 如果用户一直拒绝,并没有选择“不再提醒”的选项,                          **
     * ** 下次请求权限时,会继续有“不再提醒”的选项,并且会一直返回true            **
     * *******************************************************************************
     *
     * @param activity   上下文
     * @param permission 需要提示解释的权限申请
     * @return 需要提示:true,不需要:false
     */
    public static final boolean shouldShowRequestPermissionRationale(Activity activity, String permission) {
        return ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);<

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信