转载请说明出处!
作者: kqw攻城狮
出处: 个人站 | CSDN
效果图
GitHub地址: PermissionsManager
随着Android 6.0的普及,动态权限的重要性也开始时慢慢体现出来。为了更好的保护用户隐私,Android 6.0要求在进行敏感操作之前,必须要向用户请示申请权限。
如何使用,在之前的文章里也已经介绍过了,但是用起来比较麻烦。 Android6.0动态获取权限
我希望可以封装一下,使用之前创建一个动态权限的管理对象,他有两个回调来告诉我权限申请成功或者失败,像这样:
mPermissionsManager = new PermissionsManager(this) { @Override publicvoidauthorized(intrequestCode){ // TODO 权限通过 } @Override publicvoidnoAuthorization(intrequestCode, String[] lacksPermissions){ // TODO 有权限没有通过 } };
使用的时候,可以直接调用一个方法,把要请示的权限传进去就可以进行校验,像这样:
// 检查权限 mPermissionsManager.checkPermissions("请求码", "要校验的权限");
于是乎,下面封装的动态权限管理器就来了:
package com.kongqw.permissionslibrary; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import java.util.ArrayList; /** * Created by kongqingwei on 2017/2/15. * 检查权限的类 */ public abstract classPermissionsManager{ private static final String PACKAGE_URL_SCHEME = "package:"; private Activity mTargetActivity; publicabstractvoidauthorized(intrequestCode); publicabstractvoidnoAuthorization(intrequestCode, String[] lacksPermissions); publicPermissionsManager(Activity targetActivity){ mTargetActivity = targetActivity; } /** * 检查权限 * * @param requestCode 请求码 * @param permissions 准备校验的权限 */ publicvoidcheckPermissions(intrequestCode, String... permissions){ ArrayList<String> lacks = new ArrayList<>(); for (String permission : permissions) { if (ContextCompat.checkSelfPermission(mTargetActivity.getApplicationContext(), permission) == PackageManager.PERMISSION_DENIED) { lacks.add(permission); } } if (!lacks.isEmpty()) { // 有权限没有授权 String[] lacksPermissions = new String[lacks.size()]; lacksPermissions = lacks.toArray(lacksPermissions); //申请CAMERA权限 ActivityCompat.requestPermissions(mTargetActivity, lacksPermissions, requestCode); } else { // 授权 authorized(requestCode); } } /** * 复查权限 * <p> * 调用checkPermissions方法后,会提示用户对权限的申请做出选择,选择以后(同意或拒绝) * TargetActivity会回调onRequestPermissionsResult方法, * 在onRequestPermissionsResult回调方法里,我们调用此方法来复查权限,检查用户的选择是否通过了权限申请 * * @param requestCode 请求码 * @param permissions 权限 * @param grantResults 授权结果 */ publicvoidrecheckPermissions(intrequestCode, @NonNull String[] permissions, @NonNullint[] grantResults){ for (int grantResult : grantResults) { if (grantResult == PackageManager.PERMISSION_DENIED) { // 未授权 noAuthorization(requestCode, permissions); return; } } // 授权 authorized(requestCode); } /** * 进入应用设置 * * @param context context */ publicstaticvoidstartAppSettings(Context context){ Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setData(Uri.parse(PACKAGE_URL_SCHEME + context.getPackageName())); context.startActivity(intent); } }
使用起来的逻辑也比较清晰简单,一共3步:
// 初始化 mPermissionsManager = new PermissionsManager(this) { @Override publicvoidauthorized(intrequestCode){ Toast.makeText(getApplicationContext(), requestCode + " : 全部权限通过", Toast.LENGTH_SHORT).show(); } @Override publicvoidnoAuthorization(intrequestCode, String[] lacksPermissions){ Toast.makeText(getApplicationContext(), requestCode + " : 有权限没有通过!需要授权", Toast.LENGTH_SHORT).show(); for (String permission : lacksPermissions) { Log.i(TAG, "noAuthorization: " + permission); } } };
// 要校验的权限 String[] PERMISSIONS = new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA}; // 检查权限 mPermissionsManager.checkPermissions(0, PERMISSIONS);
用户对权限申请的提示做出选择以后,要重写TargetActivity的 onRequestPermissionsResult
方法来复查权限,检查权限是否通过。
@Override publicvoidonRequestPermissionsResult(intrequestCode, @NonNull String[] permissions, @NonNullint[] grantResults){ // 用户做出选择以后复查权限,判断是否通过了权限申请 mPermissionsManager.recheckPermissions(requestCode, permissions, grantResults); }
进入应用设置页面
最后,权限没有通过,是不能使用的,如果一定要用,一般要提示用户缺少权限,到应用设置页面去吧权限打开,再回来使用。
对话框就不写了,进入到应用的设置页面可以直接调用 PermissionsManager
里的 startAppSettings
方法,进入到该应用的设置页面,修改权限
PermissionsManager.startAppSettings(getApplicationContext());