package com.netease.nim.uikit.permission; import android.annotation.TargetApi; import android.app.Activity; import android.content.pm.PackageManager; import android.os.Build; import android.support.v4.app.Fragment; import android.util.Log; import java.util.ArrayList; import java.util.List; public class BaseMPermission { private static final String TAG = "MPermission"; public enum MPermissionResultEnum { GRANTED, DENIED, DENIED_NEVER_ASK_AGAIN } static boolean isOverMarshmallow() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; } static Activity getActivity(Object object) { if (object instanceof Fragment) { return ((Fragment) object).getActivity(); } else if (object instanceof Activity) { return (Activity) object; } return null; } /** * 获取权限请求结果 */ public static List<MPermissionResultEnum> getPermissionResult(Activity activity, String[] permissions) { return findPermissionResult(activity, permissions); } public static List<MPermissionResultEnum> getPermissionResult(Fragment fragment, String[] permissions) { return findPermissionResult(fragment.getActivity(), permissions); } @TargetApi(value = Build.VERSION_CODES.M) private static List<MPermissionResultEnum> findPermissionResult(Activity activity, String... permissions) { boolean overM = isOverMarshmallow(); List<MPermissionResultEnum> result = new ArrayList<>(); for (String p : permissions) { if (overM) { if (activity.checkSelfPermission(p) == PackageManager.PERMISSION_GRANTED) { result.add(MPermissionResultEnum.GRANTED); } else { if (!activity.shouldShowRequestPermissionRationale(p)) { result.add(MPermissionResultEnum.DENIED_NEVER_ASK_AGAIN); } else { result.add(MPermissionResultEnum.DENIED); } } } else { result.add(MPermissionResultEnum.GRANTED); } } return result; } /** * 获取所有被未被授权的权限 */ public static List<String> getDeniedPermissions(Activity activity, String[] permissions) { return findDeniedPermissions(activity, permissions); } public static List<String> getDeniedPermissions(Fragment fragment, String[] permissions) { return findDeniedPermissions(fragment.getActivity(), permissions); } @TargetApi(value = Build.VERSION_CODES.M) static List<String> findDeniedPermissions(Activity activity, String... permissions) { if (!isOverMarshmallow()) { return null; } List<String> denyPermissions = new ArrayList<>(); for (String value : permissions) { if (activity.checkSelfPermission(value) != PackageManager.PERMISSION_GRANTED) { denyPermissions.add(value); } } return denyPermissions; } /** * 获取被拒绝且勾选不再询问的权限 * 请在请求权限结果回调中使用,因为从未请求过的权限也会被认为是该结果集 */ public static List<String> getNeverAskAgainPermissions(Activity activity, String[] permissions) { return findNeverAskAgainPermissions(activity, permissions); } public static List<String> getNeverAskAgainPermissions(Fragment fragment, String[] permissions) { return findNeverAskAgainPermissions(fragment.getActivity(), permissions); } @TargetApi(value = Build.VERSION_CODES.M) private static List<String> findNeverAskAgainPermissions(Activity activity, String... permissions) { if (!isOverMarshmallow()) { return null; } List<String> neverAskAgainPermission = new ArrayList<>(); for (String value : permissions) { if (activity.checkSelfPermission(value) != PackageManager.PERMISSION_GRANTED && !activity.shouldShowRequestPermissionRationale(value)) { // 拒绝&不要需要解释了(用户勾选了不再询问) // 坑爹:第一次不做任何设置,返回值也是false。建议在权限授权结果里判断!!! neverAskAgainPermission.add(value); } } return neverAskAgainPermission; } @TargetApi(value = Build.VERSION_CODES.M) static boolean hasNeverAskAgainPermission(Activity activity, List<String> permission) { if (!isOverMarshmallow()) { return false; } for (String value : permission) { if (activity.checkSelfPermission(value) != PackageManager.PERMISSION_GRANTED && !activity.shouldShowRequestPermissionRationale(value)) { return true; } } return false; } /** * 获取被拒绝但没有勾选不再询问的权限(可以继续申请,会继续弹框) */ public static List<String> getDeniedPermissionsWithoutNeverAskAgain(Activity activity, String[] permissions) { return findDeniedPermissionWithoutNeverAskAgain(activity, permissions); } public static List<String> getDeniedPermissionsWithoutNeverAskAgain(Fragment fragment, String[] permissions) { return findDeniedPermissionWithoutNeverAskAgain(fragment.getActivity(), permissions); } @TargetApi(value = Build.VERSION_CODES.M) private static List<String> findDeniedPermissionWithoutNeverAskAgain(Activity activity, String... permission) { if (!isOverMarshmallow()) { return null; } List<String> denyPermissions = new ArrayList<>(); for (String value : permission) { if (activity.checkSelfPermission(value) != PackageManager.PERMISSION_GRANTED && activity.shouldShowRequestPermissionRationale(value)) { denyPermissions.add(value); // 上次申请被用户拒绝了 } } return denyPermissions; } /** * Log专用 */ public static void printMPermissionResult(boolean preRequest, Activity activity, String[] permissions) { Log.i(TAG, "----- MPermission result " + (preRequest ? "before" : "after") + " request:"); List<BaseMPermission.MPermissionResultEnum> result = MPermission.getPermissionResult(activity, permissions); int i = 0; for (BaseMPermission.MPermissionResultEnum p : result) { Log.i(TAG, "* MPermission=" + permissions[i++] + ", result=" + p); } } static String toString(List<String> permission) { if (permission == null || permission.isEmpty()) { return ""; } return toString(permission.toArray(new String[permission.size()])); } private static String toString(String[] permission) { if (permission == null || permission.length <= 0) { return ""; } StringBuilder sb = new StringBuilder(); for (String p : permission) { sb.append(p.replaceFirst("android.permission.", "")); sb.append(","); } sb.deleteCharAt(sb.length() - 1); return sb.toString(); } }