android 6.0 动态权限申请帮助类
我们都知道,在android 6.0 及以上版本中,google为了增强安全性,推出了动态权限申请,即某些权限需要用户在使用时手动的授权,如果不授权则应用无法获得相关权限,那么相关权限申请,具体步骤是什么呢?下边进行简单的步骤梳理:
- 通过checkSelfPermission()检测是否已经开启了相关权限,如果已经开启,则不需要权限申请
- 如果未开启,则判断是否需要向用户解释为何申请权限shouldShowRequestPermissionRationale
- 如果需要(即返回true),则可以弹出对话框提示用户申请权限原因,用户确认后申请权限requestPermissions(),如果不需要(即返回false),则直接申请权限requestPermissions()
下边是将权限申请过程,写成了一个帮助类:
package com.zhangzd.demo.permissiondemo;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/**
* Created by ZHANGZD on 2017/3/22.
* 用以6.0以上版本动态申请相关权限
* 单例模式创建帮助类对象
*/
public class PermissionUtils {
private static PermissionUtils instance;
private PermissionUtils(){} //私有化构造方法
public static final int requestPermissionCode = 100;
/**
* 公共方法,用于获得帮助类的单例对象
* @return
*/
public static PermissionUtils getInstance() {
if (instance == null) {
instance = new PermissionUtils();
}
return instance;
}
/**
* 权限申请
*
* @param activity
* @param permissions
* new String[] 字符串数组,每一个元素即要申请的权限
*/
public void requestPermission(Activity activity, String[] permissions) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
//如果sdk版本号小于23 ,则不用动态申请权限,直接返回
return;
}
boolean isRequestPermission = false;
//循环判断是否存在需要申请的权限,如果存在,将标志置为true
for (String p : permissions) {
if (!hasPermission(p, activity)) {
isRequestPermission = true;
break;
}
}
if (isRequestPermission) {
requestPermissionsSafely(permissions, requestPermissionCode, activity);
}
}
/**
* 判断是否需要申请权限
* 两种情况下不需要申请
* 1. 当前版本号小于23
* 2. 申请的权限已经被授予
* @param permission 需要申请的权限
* @param activity
* @return 返回true 表明需要申请该权限,返回false 表明不需要申请
*/
@TargetApi(Build.VERSION_CODES.M)
private boolean hasPermission(String permission, Activity activity) {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || activity.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
}
/**
* 申请相关权限
*/
@TargetApi(Build.VERSION_CODES.M)
private void requestPermissionsSafely(String[] permissions, int requestCode, Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
activity.requestPermissions(permissions, requestCode);
}
}
/**
* 权限申请结果的相应方法
* @param requestCode
* @param permissions
* @param grantResults
* @param activity
* @return
*/
public boolean onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults, Activity activity) {
if (requestCode == requestPermissionCode) {
List<String> deniedPermissions = new ArrayList<>(); //用来存放没有申请通过的权限
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
deniedPermissions.add(permissions[i]);
}
}
if (deniedPermissions.size() > 0) {
//授权失败
Toast.makeText(activity,"授权成功!",Toast.LENGTH_SHORT).show();
return false;
} else {
//授权成功
Toast.makeText(activity,"授权失败!",Toast.LENGTH_SHORT).show();
return true;
}
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
activity.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
return true;
}
}