// TODO 权限通过
}
@Override
public void noAuthorization(int requestCode, 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 class PermissionsManager {
private static final String PACKAGE_URL_SCHEME = "package:";
private Activity mTargetActivity;
public abstract void authorized(int requestCode);
public abstract void noAuthorization(int requestCode, String[] lacksPermissions);
public PermissionsManager(Activity targetActivity) {
mTargetActivity = targetActivity;
}
/**
* 检查权限
*
* @param requestCode 请求码
* @param permissions 准备校验的权限
*/
public void checkPermissions(int requestCode, 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 授权结果
*/
public void recheckPermissions(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
// 未授权
noAuthorization(requestCode, permissions);
return;
}
}
// 授权
authorized(requestCode);
}
/**
* 进入应用设置
*
* @param context context
*/
public static void startAppSettings(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步:
### 1\. 初始化权限管理器
// 初始化
mPermissionsManager = new PermissionsManager(this) {
分享读者
作者2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。
被人面试过,也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!
我们整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。
主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。
如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!
我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。
[外链图片转存中…(img-Kqktkgol-1726033318733)]
如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!
我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。