分类
① 普通权限 : 不需要动态获取。
② 危险权限 : 需要动态获取。
依赖
implementation 'com.squareup.okhttp3:okhttp:3.12.0' //okhttp
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.0' // okhttp.logging
implementation 'io.reactivex.rxjava2:rxjava:2.2.4' //RxJava
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' //Retrofit_Android
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'//Retrofit配合Rxjava 使用
implementation 'com.squareup.retrofit2:retrofit:2.5.0' //Retrofit
implementation 'com.squareup.retrofit2:converter-gson:2.5.0' //转换器,请求结果转换成Modelr
implementation 'com.github.tbruyelle:rxpermissions:0.10.2'//rxpermissions
使用方法
private static final String allNeedPermissions[] = new String[]{Manifest.permission.CAMERA
,Manifest.permission.READ_PHONE_NUMBERS,Manifest.permission.ACCESS_FINE_LOCATION};
private static String optionalPermissions [] = new String[]{Manifest.permission.BODY_SENSORS}; // 这个权限是可选的
//MkPermissionManager 工具类
/**
* 构造参数
* FragmentActivity :上下文
* Fragment:上下文
*
* checkPermission()的参数
* Activity:上下文
* OnPermissionCallBack :回调OnPermissionCallBack接口,重写4个方法
* String [] must:必须授权的权限数组
* String [] optional:这个权限是可选的,可以授权,也可以不授权。若没有,则可以传null
*/
new MkPermissionManager(MainActivity.this).checkPermission(MainActivity.this, new MkPermissionManager.OnPermissionCallBack() {
@Override
public void onAllMustAccept() {//全部授权
Toast.makeText(MainActivity.this, "授权完成,请使用", Toast.LENGTH_SHORT).show();
}
@Override
public void shouldShowRationale(MkPermissionManager.PermissionCall call, String[] unGrantedPermissions) {
AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
builder.setMessage("做什么,需要权限")
.setNegativeButton("决绝", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
////让以授权的权限 和 必须授权的权限比较,是否有相等的权限,如果有 就授权不足,没有则是全部都授权了
for(int i = 0; i < unGrantedPermissions.length;i++){
for(int j = 0; j < allNeedPermissions.length; j++){
if(unGrantedPermissions[i] == allNeedPermissions[j]){
Toast.makeText(MainActivity.this, "授权不足", Toast.LENGTH_SHORT).show();
return;
}
}
}
Toast.makeText(MainActivity.this, "所有必须权限都接受了,可以进行下一步操作", Toast.LENGTH_SHORT).show();
}
}).setPositiveButton("同意", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
call.requestPermission(); // 重新请求权限
}
}).show();
}
@Override
public void shouldShowPermissionSetting() {// 给用解释,需要到设置页面去手动打开权限
showSettingDialog();
}
@Override
public void onDenied() {//授权未完成
Toast.makeText(MainActivity.this, "授权不足", Toast.LENGTH_SHORT).show();
}
},allNeedPermissions,optionalPermissions);
}
});
public static void toSelfSetting(Context context) {
Intent mIntent = new Intent();
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 9) {
mIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
mIntent.setData(Uri.fromParts("package", context.getPackageName(), null));
} else if (Build.VERSION.SDK_INT <= 8) {
mIntent.setAction(Intent.ACTION_VIEW);
mIntent.setClassName("com.android.settings", "com.android.setting.InstalledAppDetails");
mIntent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName());
}
context.startActivity(mIntent);
}
public void showSettingDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("上传头像需要相机权限,否则没法实现,点击同意按钮进入设置页面打开权限,否则点击拒绝").setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "授权不足", Toast.LENGTH_SHORT).show();
}
}).setPositiveButton("同意", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "用户同意到设置页面打开权限", Toast.LENGTH_SHORT).show();
toSelfSetting(MainActivity.this);
}
});
builder.show();
}
PermissionManager工具类
/*
* ActivityCompat.shouldShowRequestPermissionRationale 它返回一个boolean 类型,但是分两种情况:
*
* 1. 如果用户之前决绝过授权,如果都没有点击不在询问的checkbox ,那么 return true,只要有一个点击了不在询问的checkbox return false,
* 2. 如果是在第一次请求权限之前,调用这个方法。return false; 因为用户都没有拒绝过,所有不用去显示解释dialog
*
*
**/
package com.example.demo8interface.utils;
import android.annotation.SuppressLint;
import android.app.Activity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import com.example.demo8interface.MainActivity;
import com.tbruyelle.rxpermissions2.RxPermissions;
import java.util.ArrayList;
import java.util.Arrays;
import io.reactivex.functions.Consumer;
public class MkPermissionManager {
private RxPermissions rxPermissions;
public MkPermissionManager(FragmentActivity fragmentActivity) {
rxPermissions = new RxPermissions(fragmentActivity);
}
public MkPermissionManager(Fragment fragment) {
rxPermissions = new RxPermissions(fragment);
}
@SuppressLint("CheckResult")
public void checkPermission(final Activity activity, final OnPermissionCallBack callBack, final String [] must, String [] optional){
String all [] = concat(must, optional);
final String [] unGrantedArr = getUnGrantedPermissions(all);
if(unGrantedArr != null && unGrantedArr.length > 0){
rxPermissions.shouldShowRequestPermissionRationale(activity,unGrantedArr).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if(aBoolean){ // 只有用户之前拒绝过。并且所有权限都决绝时都没有点击 不在询问得checkbox,才会需要显示解释对话框
callBack.shouldShowRationale(new PermissionCall() {
@Override
public void requestPermission() {
rxPermissions.request(unGrantedArr).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if(aBoolean){
callBack.onAllMustAccept();
}else{
if(verifyPermissions(must)){
callBack.onAllMustAccept();
}else{
callBack.onDenied();
}
}
}
});
}
},unGrantedArr);
}else{
rxPermissions.request(unGrantedArr).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if(!aBoolean){
if(verifyPermissions(must)){
callBack.onAllMustAccept();
}else{
rxPermissions.shouldShowRequestPermissionRationale(activity, unGrantedArr).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if(!aBoolean){
callBack.shouldShowPermissionSetting();
}else{
callBack.onDenied();
}
}
});
}
}else{
callBack.onAllMustAccept();
}
}
});
}
}
});
}else{
callBack.onAllMustAccept();
}
}
private String [] concat(String [] must,String optional []){
ArrayList<String> arrayList = new ArrayList<>();
if(must != null){
arrayList.addAll( Arrays.asList(must));
}
if(optional != null){
arrayList.addAll( Arrays.asList(optional));
}
return arrayList.toArray(new String[0]);
}
private boolean verifyPermissions(String ...permissions){
if (permissions.length < 1) {
return true;
}
// Verify that each required permission has been granted, otherwise return false.
for (String per : permissions) {
if(!rxPermissions.isGranted(per)){
return false;
}
}
return true;
}
/**
* 获取所有权限中,未授权的
* @param permissions
* @return
*/
private String [] getUnGrantedPermissions(String ...permissions){
ArrayList<String> list = new ArrayList<>();
for(String permission : permissions){
if(!rxPermissions.isGranted(permission)){
list.add(permission);
}
}
if(list.size() > 0){
return list.toArray(new String[0]);
}
return null;
}
public interface OnPermissionCallBack{
// 所有必须授权的权限都授权了,
void onAllMustAccept();
// 需要显示一个解释说明的对话框,如果用户点击了同意就调用call.requestPermission 方法,如果用户拒绝,那么你需要判断一下拒绝权限里面是否包含不要权限,如果不包含,即使拒绝了,也可以继续下一步
void shouldShowRationale(PermissionCall call,String unGrantedPermissions []);
// 当用户在授权dialog 选中了不在询问得checkbox 时,你需要引导用户去权限设置页面手动开启权限
void shouldShowPermissionSetting();
// 所有必须授权的权限只有有一个没有授权都会回掉这个。
void onDenied();
}
public interface PermissionCall{
//当显示 解释对话框时,用户点击 "确认" 或者 "同意授权时" 按钮时,调用该方法让该工具类去请求授权
void requestPermission();
}
}
危险权限分类:


网友评论