Android权限校验Util封装,拿拍照为例,直接上代码
//请求权限
private void checkPermission(){
String[] PERMISSIONS = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
};
PermissionUtils.requestMultiPermissionsAll(activity, PERMISSIONS, new PermissionUtils.PermissionGrant() {
@Override
public void onPermissionGranted() {
openLocalImage(activity, curRequestCode);
}
@Override
public void onPermissionDenied(String[] permissions, int[] grantResults) {
PermissionUtils.openSystemSetting(activity, "打开相册失败。\n\n请前往\"设置\"-\"权限管理\"-打开所需权限。");
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionUtils.requestPermissionsResult(requestCode, permissions, grantResults);
}
package com.intpay.market.utils;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.content.PermissionChecker;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by danxiang.feng on 2018/3/5.
*/
public class PermissionUtils {
private static final int CODE_REQUEST_PERMISSION = 900;
private static int mRequestCode = CODE_REQUEST_PERMISSION;
private static Map<Integer, PermissionGrant> callbackMap = new HashMap<>();
public interface PermissionGrant {
/**
* 当所有权限的申请被用户同意之后,该方法会被调用
*/
void onPermissionGranted();
/**
* 当权限申请中的某一个或多个权限,被用户否定了
*
* @param permissions 本次授权权限列表
* @param grantResults 本次授权结果,0:授权成功 -1:拒绝授权
*/
void onPermissionDenied(String[] permissions, int[] grantResults);
}
/**
* 跳转到系统设置界面去开启权限
*
* @param context
* @param message
*/
public static AlertDialog openSystemSetting(final Context context, String message) {
return D.show(context, null, message, "取消", "设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) { //去设置权限
startAppSettings(context);
dialog.dismiss();
}
}
});
}
/**
* 启动应用的设置
*/
private static void startAppSettings(Context context) {
try {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
private static int getRequestCode() {
mRequestCode++;
return mRequestCode;
}
/************************ 执行授权 *******************************/
public static boolean checkPermission(final Object object, final int requestCode, String[] requestPermissions, String message) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Context context = getActivityOrFragmentContext(object);
if (context == null) {
L.e("requestMultiPermissionsAll======>object 必须为 activity 或 fragment");
return false;
}
//获取没有授权的权限
final List<String> permissionList = getNoGrantedPermission(object, requestPermissions, false);
//获取上次被拒权限列表
final List<String> shouldRationalePermissionsList = getNoGrantedPermission(object, requestPermissions, true);
if (permissionList.size() > 0) {
executePermissionsRequest(object, permissionList.toArray(new String[permissionList.size()]), requestCode);
return false;
} else if (shouldRationalePermissionsList.size() > 0) {
D.show(context, null, "应用缺少权限,是否重新去授权?", null, "确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) { //去设置权限
executePermissionsRequest(object, shouldRationalePermissionsList.toArray(new String[shouldRationalePermissionsList.size()]), requestCode);
}
}
});
return false;
} else {
for (String requestPermission : requestPermissions) {
int checkSelfPermission = PermissionChecker.checkSelfPermission(context, requestPermission);
if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
if (!Util.isEmpty(message)) {
openSystemSetting(context, message);
}
return false;
}
}
}
}
return true;
}
/**
* 返回权限检查结果
*/
private static void handleResult(int requestCode, String[] permissions, int[] grantResults) {
if (callbackMap.containsKey(requestCode)) {
PermissionGrant permissionGrant = callbackMap.get(requestCode);
boolean hasPermission = true;
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
hasPermission = false;
break;
}
}
if (hasPermission) {
permissionGrant.onPermissionGranted();
} else {
permissionGrant.onPermissionDenied(permissions, grantResults);
}
callbackMap.remove(requestCode);
}
}
/**
* 一次申请多个权限
* object 必须为 activity 或 fragment
*/
public static void requestMultiPermissionsAll(Object object, String[] requestPermissions, PermissionGrant grant) {
int requestCode = getRequestCode();
callbackMap.put(requestCode, grant);
Context context = getActivityOrFragmentContext(object);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestMultiPermissionsM(object, requestCode, requestPermissions);
} else {
PackageManager pkm = context.getPackageManager();
String packageName = context.getPackageName();
int[] grantResults = new int[requestPermissions.length];
for (int i = 0; i < requestPermissions.length; i++) {
grantResults[i] = pkm.checkPermission(requestPermissions[i], packageName);
}
handleResult(requestCode, requestPermissions, grantResults);
}
}
/**
* 一次申请多个权限 M
*/
private static void requestMultiPermissionsM(final Object object, final int requestCode, String[] requestPermissions) {
//获取没有授权的权限
final List<String> permissionList = getNoGrantedPermission(object, requestPermissions, false);
//获取上次被拒权限列表
final List<String> shouldRationalePermissionsList = getNoGrantedPermission(object, requestPermissions, true);
if (permissionList.size() > 0) {//去授权
executePermissionsRequest(object, permissionList.toArray(new String[permissionList.size()]), requestCode);
} else if (shouldRationalePermissionsList.size() > 0) {
D.show(getActivityOrFragmentContext(object), null, "应用缺少权限,请重新去授权?", null, "确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) { //去设置权限
executePermissionsRequest(object, shouldRationalePermissionsList.toArray(new String[shouldRationalePermissionsList.size()]), requestCode);
}
}
});
} else {
int[] grantResults = new int[requestPermissions.length];
handleResult(requestCode, requestPermissions, grantResults);
}
}
private static ArrayList<String> getNoGrantedPermission(Object object, String[] requestPermissions, boolean isShouldRationale) {
ArrayList<String> permissions = new ArrayList<>();
for (int i = 0; i < requestPermissions.length; i++) {
String requestPermission = requestPermissions[i];
int checkSelfPermission = PermissionChecker.checkSelfPermission(getActivityOrFragmentContext(object), requestPermission);
if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
boolean flag = shouldShowRequestPermissionRationale(object, requestPermission);
if (flag) {
if (isShouldRationale) {
permissions.add(requestPermission);
}
} else {
if (!isShouldRationale) {
permissions.add(requestPermission);
}
}
}
}
return permissions;
}
/************* 处理授权结果 ************************/
/**
* activity回调处理授权
*
* @param requestCode Need consistent with requestPermission
* @param permissions
* @param grantResults
*/
public static void requestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
handleResult(requestCode, permissions, grantResults);
}
@TargetApi(23)
private static Context getActivityOrFragmentContext(Object object) {
if (object instanceof Activity) {
return (Activity) object;
} else if (object instanceof Fragment) {
return ((Fragment) object).getContext();
} else if (object instanceof android.app.Fragment) {
return ((android.app.Fragment) object).getContext();
}
return null;
}
@TargetApi(23)
private static void executePermissionsRequest(Object object, String[] permissions, int requestCode) {
if (object instanceof Activity) {
ActivityCompat.requestPermissions((Activity) object, permissions, requestCode);
} else if (object instanceof Fragment) {
((Fragment) object).requestPermissions(permissions, requestCode);
} else if (object instanceof android.app.Fragment) {
((android.app.Fragment) object).requestPermissions(permissions, requestCode);
}
}
@TargetApi(23)
private static boolean shouldShowRequestPermissionRationale(Object object, String perm) {
if (object instanceof Activity) {
return ActivityCompat.shouldShowRequestPermissionRationale((Activity) object, perm);
} else if (object instanceof Fragment) {
return ((Fragment) object).shouldShowRequestPermissionRationale(perm);
} else if (object instanceof android.app.Fragment) {
return ((android.app.Fragment) object).shouldShowRequestPermissionRationale(perm);
} else {
return false;
}
}
}