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);<