PermissionManager工具类

2020-08-06  本文已影响0人  魔女小姐的猫

分类

① 普通权限 : 不需要动态获取。
② 危险权限 : 需要动态获取。

依赖

   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();
    }

}

危险权限分类:

SY.png SY.png
上一篇 下一篇

猜你喜欢

热点阅读