Android6.0 权限管理

Android6.0之后,为了用户的安全,对于一些敏感的权限,不仅要在AndroidManifest文件声明这些权限,而且还要在代码中动态申请这些权限。

敏感权限:

CALENDAR(日历)
   READ_CALENDAR
   WRITE_CALENDAR
CAMERA(相机)
   CAMERA
CONTACTS(联系人)
   READ_CONTACTS
   WRITE_CONTACTS
   GET_ACCOUNTS
LOCATION(位置)
   ACCESS_FINE_LOCATION
   ACCESS_COARSE_LOCATION
MICROPHONE(麦克风)
   RECORD_AUDIO
PHONE(手机)
   READ_PHONE_STATE
   CALL_PHONE
   READ_CALL_LOG
   WRITE_CALL_LOG
   ADD_VOICEMAIL
   USE_SIP
   PROCESS_OUTGOING_CALLS
SENSORS(传感器)
   BODY_SENSORS
SMS(短信)
   SEND_SMS
   RECEIVE_SMS
   READ_SMS
   RECEIVE_WAP_PUSH
   RECEIVE_MMS
STORAGE(存储卡)
   READ_EXTERNAL_STORAGE
   WRITE_EXTERNAL_STORAGE

因为经常忘记怎么申请,所以干脆封装工具类,代码:

public class PermissionHelper {

    // 默认申请权限请求码
    public static final int DEFAULT_REQUEST_CODE = 888;

    /**
     * 申请权限
     * @param activity
     * @param permissions
     * @param callback
     */
    public static void requestPermission(Activity activity, String[] permissions, OnPermissionCallback callback) {
        requestPermission(activity, DEFAULT_REQUEST_CODE, permissions, callback);
    }

    /**
     * 申请权限
     * @param activity
     * @param requestCode
     * @param permissions
     * @param callback
     */
    public static void requestPermission(Activity activity, int requestCode, String[] permissions, OnPermissionCallback callback) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            if (callback != null) {
                callback.onPermissionAccept(requestCode, permissions);
            }
        }
        String[] requestPermissions = checkPermissions(activity, permissions);
        if (requestPermissions == null || requestPermissions.length == 0) {
            if (callback != null) {
                callback.onPermissionAccept(requestCode, permissions);
            }
            return;
        }
        ActivityCompat.requestPermissions(activity, requestPermissions, requestCode);
    }

    /**
     * 处理申请权限结果
     * @param requestCode
     * @param permissions
     * @param grantResults
     * @param callback
     */
    public static void handlePermissionResult(int requestCode, String permissions[], int[] grantResults, OnPermissionCallback callback) {
        List<String> refusePermissionList = new ArrayList<>();
        for (int i = 0; i < grantResults.length; i++) {
            if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                refusePermissionList.add(permissions[i]);
            }
        }
        if (refusePermissionList.size() == 0) {
            if (callback != null) {
                callback.onPermissionAccept(requestCode, permissions);
            }
            return;
        }
        if (callback != null) {
            callback.onPermissionRefuse(requestCode, refusePermissionList.toArray(new String[refusePermissionList.size()]));
        }
    }

    /**
     * 检查权限
     * @param activity
     * @param permissions
     * @return
     */
    private static String[] checkPermissions(Activity activity, String... permissions) {
        List<String> permissionList = new ArrayList<>();
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
                permissionList.add(permission);
            }
        }
        return permissionList.toArray(new String[permissionList.size()]);
    }

    /**
     * 处理权限回调
     */
    public interface OnPermissionCallback {

        /**
         * 接受
         * @param requestCode
         * @param permissions
         */
        void onPermissionAccept(int requestCode, String... permissions);

        /**
         * 拒绝
         * @param requestCode
         * @param permission
         */
        void onPermissionRefuse(int requestCode, String... permission);

    }

}

使用实例:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PermissionHelper.requestPermission(MainActivity.this, new String[]{Manifest.permission.CAMERA}, callback);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        PermissionHelper.handlePermissionResult(requestCode, permissions, grantResults, callback);
    }

    private PermissionHelper.OnPermissionCallback callback = new PermissionHelper.OnPermissionCallback() {
        @Override
        public void onPermissionAccept(int requestCode, String... permissions) {
            System.err.println("申请权限成功");
        }
        @Override
        public void onPermissionRefuse(int requestCode, String... permission) {
            System.err.println("申请权限失败");
        }
    };

}

使用起来比较简单!!

还有当用户不小心拒绝权限时,提醒用户到应用的设置页面打开权限,这里也做一下记录:

public class SettingHelper {

    // 包名
    private static final String SCHEME = "package";
    // 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.1及之前版本)
    private static final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName";
    // 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.2)
    private static final String APP_PKG_NAME_22 = "pkg";
    // InstalledAppDetails所在包名
    private static final String APP_DETAILS_PACKAGE_NAME = "com.android.settings";
    // InstalledAppDetails类名
    private static final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails";

    /**
     * 跳转到Setting页面
     * @param activity
     */
    public static void goSetting(Activity activity) {
        Intent intent = new Intent();
        final int apiLevel = Build.VERSION.SDK_INT;
        if (apiLevel >= 9) {
            // 2.3(ApiLevel 9)以上,使用SDK提供的接口
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            Uri uri = Uri.fromParts(SCHEME, activity.getPackageName(), null);
            intent.setData(uri);
        } else {
            // 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)
            // 2.2和2.1中,InstalledAppDetails使用的APP_PKG_NAME不同。
            final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22 : APP_PKG_NAME_21);
            intent.setAction(Intent.ACTION_VIEW);
            intent.setClassName(APP_DETAILS_PACKAGE_NAME, APP_DETAILS_CLASS_NAME);
            intent.putExtra(appPkgName, activity.getPackageName());
        }
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        activity.startActivity(intent);
    }

}

最后提供下载地址:https://download.csdn.net/download/johanman/10324672

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值