关于android6.0动态权限
写篇博客记录以备用
实现代码
import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* 执行动态权限方法工具类
* Created by zhoucl on 2016/11/30.
*/
public class PermissionUtil {
public static final String TAG = PermissionUtil.class.getSimpleName();
public static final int PERMISSION_REQUEST_CODE = 100;
private Activity mActivity;
private Object thisObj;
/**
* 执行动态权限方法工具类
* @param thisObj 需要使用动态授权的类
* @param mActivity 用于调起授权界面
*/
public PermissionUtil(Object thisObj, Activity mActivity) {
this.mActivity = mActivity;
this.thisObj = thisObj;
}
/**
* 需要执行的方法
*/
private Method method;
/**
* 需要用户授予的权限
*/
private HashMap<String, String> needPermissionInfo = new HashMap<>();
/**
* 加载权限,不行执行方法
*/
public void loadPermission(String[] needPermission, String[] needPermissionNote) {
doExecuteNeedPermissionMethod(null, needPermission, needPermissionNote);
}
/**
* 加载权限,不行执行方法
*/
public void loadPermission(ManifestEnum... manifestEnums) {
executeNeedPermissionMethod(null, manifestEnums);
}
/**
* 执行方法,并授权
* @param methodName 需要授权的方法
* @param manifestEnums 需要的权限
*/
public void executeNeedPermissionMethod(String methodName, ManifestEnum...manifestEnums) {
if (manifestEnums != null && manifestEnums.length > 0) {
String[] needPermission = new String[manifestEnums.length];
String[] needPermissionNote = new String[manifestEnums.length];
for (int i = 0; i < manifestEnums.length; i++) {
needPermission[i] = manifestEnums[i].getPermissionName();
needPermissionNote[i] = manifestEnums[i].getPermissionNote();
}
executeNeedPermissionMethod(methodName, needPermission, needPermissionNote);
}
}
/**
* 执行方法,并授权
* @param methodName 需要授权的方法
* @param needPermission 需要的权限
* @param needPermissionNote 需要的权限描述
*/
public void executeNeedPermissionMethod(String methodName, String[] needPermission, String[] needPermissionNote) {
Method permissionMethod = getPermissionMethod(methodName);
if (permissionMethod != null) {
doExecuteNeedPermissionMethod(permissionMethod, needPermission, needPermissionNote);
} else {
}
}
private Method getPermissionMethod(String methodName) {
try {
return thisObj.getClass().getDeclaredMethod(methodName);
} catch (NoSuchMethodException e) {
e.printStackTrace();
return null;
}
}
/**
* 执行需要权限的方法
*
* @param method 方法
* @param needPermission 该方法执行需要的权限
*/
private void doExecuteNeedPermissionMethod(Method method, String[] needPermission, String[] needPermissionNote) {
if (needPermission == null || needPermissionNote == null || needPermission.length < 1 || needPermissionNote.length < 1) {
Log.e(TAG, "您没有申请执行该方法需要的权限");
return;
}
if (needPermission.length != needPermissionNote.length) {
Log.e(TAG, "权限数据与权限说明数据要保持一致");
return;
}
needPermissionInfo.clear();
for (int i = 0; i < needPermission.length; i++) {
needPermissionInfo.put(needPermission[i], needPermissionNote[i]);
}
try {
this.method = method;
this.method.setAccessible(true);
if (needPermission.length > 0) {
List<String> permissionsNeeded = new ArrayList<String>();
final List<String> permissionsList = new ArrayList<String>();
for (String permission : needPermission) {
if (!addPermission(permissionsList, permission))
permissionsNeeded.add(permission);
}
if (permissionsList.size() > 0) {
ActivityCompat.requestPermissions(mActivity, permissionsList.toArray(new String[permissionsList.size()]), PERMISSION_REQUEST_CODE);
} else {
invokeCurrentPermissionMethod();
}
} else {
invokeCurrentPermissionMethod();
}
} catch (Exception e) {
e.printStackTrace();
// LogUtil.e("没有找到" + methodName + "方法");
}
}
private void invokeCurrentPermissionMethod() {
if (method != null) {
try {
method.invoke(thisObj);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
private boolean addPermission(List<String> permissionsList, String permission) {
if (ActivityCompat.checkSelfPermission(mActivity, permission) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
if (!ActivityCompat.shouldShowRequestPermissionRationale(mActivity, permission))
return false;
}
return true;
}
public boolean checkPermission(String permission) {
return ActivityCompat.checkSelfPermission(mActivity, permission) == PackageManager.PERMISSION_GRANTED;
}
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE: {//int[] grantResults
List<String> notPass = new ArrayList<>();
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {// 不通过
notPass.add(permissions[i]);
}
}
if (notPass.size() > 0) {
String message = "您没有授予APP " + needPermissionInfo.get(notPass.get(0));
for (int i = 1; i < notPass.size(); i++) {
message = message + ", " + needPermissionInfo.get(notPass.get(i));
}
message += " 权限,某些功能可能无法正常使用。";
new AlertDialog.Builder(mActivity)
.setTitle("温馨提示")
.setMessage(message)
.setNegativeButton("我知道了", null)
.create()
.show();
// new AlertDialog(activity).builder()
// .setTitle("温馨提示")
// .setMsg(message)
// .setNegativeButton("我知道了",null)
// .show();
//executeNeedPermissionMethod(methodName,needPermission);
} else {
if (method != null) {
invokeCurrentPermissionMethod();
}
}
}
break;
}
}
}
需要动态获取权限枚举类
package com.yft.common.util;
import android.Manifest;
/**
* Created by zhoucl on 2016/11/30.
*/
public enum ManifestEnum {
READ_CALENDAR (Manifest.permission.READ_CALENDAR , "读取日程提醒" , "允许程序读取用户的日程信息"),
WRITE_CALENDAR (Manifest.permission.WRITE_CALENDAR , "写入日程提醒" , "写入日程,但不可读取"),
READ_CONTACTS (Manifest.permission.READ_CONTACTS , "读取联系人" , "允许应用访问联系人通讯录信息"),
WRITE_CONTACTS (Manifest.permission.WRITE_CONTACTS , "写入联系人" , "写入联系人,但不可读取"),
GET_ACCOUNTS (Manifest.permission.GET_ACCOUNTS , "访问账户Gmail列表" , "访问GMail账户列表"),
ACCESS_FINE_LOCATION (Manifest.permission.ACCESS_FINE_LOCATION , "获取精确位置" , "通过GPS芯片接收卫星的定位信息,定位精度达10米以内"),
ACCESS_COARSE_LOCATION (Manifest.permission.ACCESS_COARSE_LOCATION , "获取错略位置" , "通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米"),
RECORD_AUDIO (Manifest.permission.RECORD_AUDIO , "录音" , "录制声音通过手机或耳机的麦克"),
READ_PHONE_STATE (Manifest.permission.READ_PHONE_STATE , "读取电话状态" , "访问电话状态"),
CALL_PHONE (Manifest.permission.CALL_PHONE , "拨打电话" , "允许程序从非系统拨号器里输入电话号码"),
READ_CALL_LOG (Manifest.permission.READ_CALL_LOG , "读取通话记录" , "读取通话记录"),
WRITE_CALL_LOG (Manifest.permission.WRITE_CALL_LOG , "写入通话记录" , "写入通话记录"),
ADD_VOICEMAIL (Manifest.permission.ADD_VOICEMAIL , "添加语音邮件" , "允许应用程序添加系统中的语音邮件"),
USE_SIP (Manifest.permission.USE_SIP , "使用SIP视频" , "允许程序使用SIP视频服务"),
PROCESS_OUTGOING_CALLS (Manifest.permission.PROCESS_OUTGOING_CALLS , "处理拨出电话" , "允许程序监视,修改或放弃播出电话"),
BODY_SENSORS (Manifest.permission.BODY_SENSORS , "传感器" , "传感器"),
SEND_SMS (Manifest.permission.SEND_SMS , "发送短信" , "发送短信"),
RECEIVE_SMS (Manifest.permission.RECEIVE_SMS , "接收短信" , "接收短信"),
READ_SMS (Manifest.permission.READ_SMS , "读取短信内容" , "读取短信内容"),
RECEIVE_WAP_PUSH (Manifest.permission.RECEIVE_WAP_PUSH , "接收WapPush" , "接收WapPush"),
RECEIVE_MMS (Manifest.permission.RECEIVE_MMS , "接收彩信" , "接收彩信"),
READ_EXTERNAL_STORAGE (Manifest.permission.READ_EXTERNAL_STORAGE , "读取存储卡" , "读取存储卡"),
WRITE_EXTERNAL_STORAGE (Manifest.permission.WRITE_EXTERNAL_STORAGE , "写入存储卡" , "写入存储卡"),
CAMERA (Manifest.permission.CAMERA , "拍照" , "允许访问摄像头进行拍照");
/**
* 权限名称
*/
private final String permissionName;
/**
* 权限说明
*/
private final String permissionNote;
/**
* 权限描述
*/
private final String permissionDescribe;
ManifestEnum(String permissionName, String permissionNote, String permissionDescribe) {
this.permissionName = permissionName;
this.permissionNote = permissionNote;
this.permissionDescribe = permissionDescribe;
}
public String getPermissionName() {
return permissionName;
}
public String getPermissionNote() {
return permissionNote;
}
public String getPermissionDescribe() {
return permissionDescribe;
}
}
使用方式
//在Activity中创建工具类,并设置为成员变量
PermissionUtil permissionUtil = new PermissionUtil(this,this);
// 复写Activity的onRequestPermissionsResult方法
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
permissionUtil.onRequestPermissionsResult(requestCode,permissions,grantResults);
}
// 调用方式
permissionUtil.executeNeedPermissionMethod("camera", ManifestEnum.CAMERA);