定位權限的獲取方式

/**
 * 與權限相關的工具類
 * Created by @author iblade.Wang on 2019/1/8 19:22
 */
public class PermissionUtils {


    /**
     * 判斷位置權限集合
     */
    public static String[] permissionsLocation = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};
    public static final int OP_FINE_LOCATION = 1;

    /**
     * 判斷位置權限
     *
     * @param mContext 權限數組
     * @return true-表示沒有位置權限  false-表示權限已開啓
     */
    public static boolean lacksPermissionsLocation(Context mContext) {
        int result = checkOp(mContext, OP_FINE_LOCATION, AppOpsManager.OPSTR_FINE_LOCATION);
        return result == AppOpsManagerCompat.MODE_IGNORED;
    }

    /**
     * 判斷位置權限
     *
     * @param mContext 權限數組
     * @return true-表示沒有位置權限  false-表示權限已開啓
     */
    public static boolean lacksPermissionsLocation2(Context mContext) {
        for (String permission : permissionsLocation) {
            if (lacksPermission(mContext, permission)) {
                return true;
            }
        }
        return false;

    }

    /**
     * 判斷是否缺少權限
     *
     * @param context    上下文
     * @param permission 權限
     * @return 是否已關閉該權限,true-已關閉,false-已開啓
     */
    private static boolean lacksPermission(Context context, String permission) {
        if (context.getApplicationInfo().targetSdkVersion >= 23) {
            return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED;
        } else {
            return PermissionChecker.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED;
        }
    }

    /**
     * 檢查權限列表
     *
     * @param context
     * @param op       這個值被hide了,去AppOpsManager類源碼找,如位置權限  AppOpsManager.OP_GPS==2
     * @param opString 如判斷定位權限 AppOpsManager.OPSTR_FINE_LOCATION
     * @return @see 如果返回值 AppOpsManagerCompat.MODE_IGNORED 表示被禁用了
     */
    public static int checkOp(Context context, int op, String opString) {
        final int version = Build.VERSION.SDK_INT;
        if (version >= 19) {
            Object object = context.getSystemService(Context.APP_OPS_SERVICE);
            Class c = object.getClass();
            try {
                Class[] cArg = new Class[3];
                cArg[0] = int.class;
                cArg[1] = int.class;
                cArg[2] = String.class;
                Method lMethod = c.getDeclaredMethod("checkOp", cArg);
                return (Integer) lMethod.invoke(object, op, Binder.getCallingUid(), context.getPackageName());
            } catch (Exception e) {
                e.printStackTrace();
                if (Build.VERSION.SDK_INT >= 23) {
                    return AppOpsManagerCompat.noteOp(context, opString, context.getApplicationInfo().uid,
                            context.getPackageName());
                }

            }
        }
        return -1;
    }


    /**
     * 跳轉至AppDetailSetting,用於開啓權限
     *
     * @param context 上下文
     * @return 跳轉intent
     */
    public static Intent getAppDetailSettingIntent(Context context) {
        Intent localIntent = new Intent();
        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        // SDK >= 9
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
            localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
            localIntent.setData(Uri.fromParts("package", context.getPackageName(), null));
        } else /*if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) */ {
            localIntent.setAction(Intent.ACTION_VIEW);
            localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
            localIntent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName());
        }
        return localIntent;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章