package com.lcjian.library.permission;
|
|
import android.app.Activity;
|
import android.app.AlertDialog;
|
import android.content.Context;
|
import android.content.DialogInterface;
|
import android.content.Intent;
|
import android.content.pm.PackageManager;
|
import android.net.Uri;
|
import android.os.Build;
|
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;
|
|
public class PermissionHelper {
|
|
private Activity mActivity;//当前activity
|
private PermissionInterface mPermissionInterface;//权限返回接口
|
|
public PermissionHelper(@NonNull Activity activity, @NonNull PermissionInterface permissionInterface) {
|
mActivity = activity;
|
mPermissionInterface = permissionInterface;
|
}
|
|
/**
|
* 开始请求权限。
|
* 方法内部已经对Android M 或以上版本进行了判断,外部使用不再需要重复判断。
|
* 如果设备还不是M或以上版本,则也会回调到requestPermissionsSuccess方法。
|
*/
|
public void requestPermissions() {
|
//获取要请求的权限
|
String[] deniedPermissions = getDeniedPermissions(mActivity, mPermissionInterface.getPermissions());
|
//deniedPermissions不为空长度大于0表示有未请求的权限
|
if (deniedPermissions != null && deniedPermissions.length > 0) {
|
//弹出权限请求框
|
requestPermissions(mActivity, deniedPermissions, mPermissionInterface.getPermissionsRequestCode());
|
} else {
|
//权限请求成功
|
mPermissionInterface.requestPermissionsSuccess();
|
}
|
}
|
|
/**
|
* 弹出对话框请求权限
|
*
|
* @param activity
|
* @param permissions
|
* @param requestCode
|
*/
|
public static void requestPermissions(Activity activity, String[] permissions, int requestCode) {
|
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
// 请求权限兼容低版本
|
ActivityCompat.requestPermissions(activity, permissions, requestCode);
|
// }
|
}
|
|
/**
|
* 在Activity中的onRequestPermissionsResult中调用
|
* 请求权限结果 回调权限是否请求成功
|
*
|
* @param requestCode 权限请求码
|
* @param permissions 申请的权限
|
* @param grantResults
|
* @return true 代表对该requestCode感兴趣,并已经处理掉了。false 对该requestCode不感兴趣,不处理。
|
*/
|
public boolean requestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
//权限请求码一致
|
if (requestCode == mPermissionInterface.getPermissionsRequestCode()) {
|
boolean isAllGranted = true;//是否全部权限已授权
|
for (int result : grantResults) {
|
//未授权权限
|
if (result == PackageManager.PERMISSION_DENIED) {
|
isAllGranted = false;
|
break;
|
}
|
}
|
if (isAllGranted) {
|
//已全部授权
|
mPermissionInterface.requestPermissionsSuccess();
|
} else {
|
//权限有缺失
|
mPermissionInterface.requestPermissionsFail();
|
showSettingDialog();//弹出设置框
|
}
|
return isAllGranted;
|
}
|
return false;
|
}
|
|
|
/**
|
* 返回缺失的权限
|
*
|
* @param context
|
* @param permissions
|
* @return 返回缺少的权限,null 意味着没有缺少权限
|
*/
|
public static String[] getDeniedPermissions(Context context, String[] permissions) {
|
//Android M 以上申请权限
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
ArrayList<String> deniedPermissionList = new ArrayList<>();
|
for (String permission : permissions) {
|
//权限未许可则记录权限
|
if (context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
|
deniedPermissionList.add(permission);
|
}
|
}
|
int size = deniedPermissionList.size();
|
//返回String数组权限
|
if (size > 0) {
|
return deniedPermissionList.toArray(new String[deniedPermissionList.size()]);
|
}
|
}
|
return null;
|
}
|
|
// 判断权限集合 是否授权 false授权 true未授权
|
public boolean lacksPermissions(String... permissions) {
|
for (String permission : permissions) {
|
if (lacksPermission(permission)) {
|
return true;
|
}
|
}
|
return false;
|
}
|
|
// 判断是否缺少权限
|
private boolean lacksPermission(String permission) {
|
//权限未授权
|
return ContextCompat.checkSelfPermission(mActivity, permission) == PackageManager.PERMISSION_DENIED;
|
}
|
|
/**
|
* 弹出权限请求通知框(更具需求 不需要知道了弹窗直接弹权限申请)
|
*/
|
public void showNormalDialog() {
|
requestPermissions();//开始请求权限。
|
}
|
|
/**
|
* 弹出权限设置通知框
|
*/
|
public void showSettingDialog() {
|
|
AlertDialog dialog = new AlertDialog.Builder(mActivity).setTitle("温馨提示").setMessage("权限已被拒绝如要正常使用,请设置相关权限").setNegativeButton("不用了", new DialogInterface.OnClickListener() {
|
@Override
|
public void onClick(DialogInterface dialog, int which) {
|
dialog.dismiss();
|
}
|
}).setPositiveButton("去设置", new DialogInterface.OnClickListener() {
|
@Override
|
public void onClick(DialogInterface dialog, int which) {
|
startAppSettings();//打开设置
|
dialog.dismiss();
|
}
|
}).create();
|
dialog.show();
|
}
|
|
private static final String PACKAGE_URL_SCHEME = "package:"; // 方案
|
|
// 启动应用的设置
|
private void startAppSettings() {
|
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
intent.setData(Uri.parse(PACKAGE_URL_SCHEME + mActivity.getPackageName()));
|
mActivity.startActivity(intent);
|
}
|
}
|