运行时权限初步封装Minipermission,日后会继续完善。

1 篇文章 0 订阅
1 篇文章 0 订阅
package com.example.user.myapplication;

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 android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

/**
 *  使用步骤四步
 * 方式一:
 * 1,实现LPermissionsCallback;
 * 2,在需要的地方创建LPermissions 对象;
 * 3,重写activity的onRequestLPermissionsResult方法,直接将参数传递给LPermissions.onRequestLPermissionsResult
 * 4,实现gotPermissionsAndDo()方法
 * 方式二:
 * 内部类实现方式,代码臃肿,但灵活度高
 */

public class LPermissions {
    public static final int LPermissions_REQUEST_CODE = 1111;
    String[] permissions = new String[]{};//Manifest.permission.CALL_PHONE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
    List<String> mPermissionList = new ArrayList<String>();//未授予权限列表
    AppCompatActivity activity = null;
    LPermissionsCallback lPermissionsCallback = null;
    public LPermissions(AppCompatActivity activity, String[] permisssions, LPermissionsCallback lPermissionsCallback){
        this.permissions = permisssions;
        this.activity = activity;
        this.lPermissionsCallback = lPermissionsCallback;
        checkPermissions();
        requestPermissions();
    }
    private void checkPermissions() {
        if(Build.VERSION.SDK_INT < 23)
            return;
        /** * 判断哪些权限未授予 */
        mPermissionList.clear();
        for (int i = 0; i < permissions.length; i++) {
            if (ContextCompat.checkSelfPermission(activity, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
                mPermissionList.add(permissions[i]);
            }
        }
    }
    private void requestPermissions(){
        if(Build.VERSION.SDK_INT < 23)
            return;
        /** * 判断是否为空 */
        if (mPermissionList.isEmpty()) {
            //未授予的权限为空,表示都授予了
            lPermissionsCallback.gotPermissionsAndDo();
        } else {
            //请求权限方法
            String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
             ActivityCompat.requestPermissions(activity, permissions, LPermissions_REQUEST_CODE);
        }
    }

    public void onRequestLPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case LPermissions_REQUEST_CODE:
                for (int i = 0; i < grantResults.length; i++) {
                    if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                        //判断是否勾选禁止后不再询问
                        boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(activity, permissions[i]);
                        if (showRequestPermission) {//
                            // ActivityCompat.requestPermissions(this, new String[]{permissions[i]}, 1);//重新申请权限
                            //
                        }else {
                            showPermissionDialog();
                        } return;
                    }
                }
                lPermissionsCallback.gotPermissionsAndDo();
                break;
            default:
                break;
        }
    }

    /**
     * 不再提示权限 时的展示对话框
     * */
    AlertDialog mPermissionDialog;
    private void showPermissionDialog() {
        if (mPermissionDialog == null) {
            mPermissionDialog = new AlertDialog.Builder(activity)
                    .setMessage("已禁用权限,请手动授予")
             .setPositiveButton("设置" , new DialogInterface.OnClickListener() {//设置
                 @Override public void onClick(DialogInterface dialog, int which) {
                     cancelPermissionDialog();
                     Uri packageURI = Uri.parse("package:" + activity.getPackageName());
                     Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                     activity.startActivity(intent);
                 }
            }).setNegativeButton("取消", new DialogInterface.OnClickListener() {//"取消"
                 @Override public void onClick(DialogInterface dialog, int which) {
                     cancelPermissionDialog();
                 }
            }).create();
        }
        mPermissionDialog.show();
    }

    private void cancelPermissionDialog() {
        mPermissionDialog.cancel();
    }

    interface LPermissionsCallback{
        void gotPermissionsAndDo();
    }

}

上面只是一个思路,后经过思考之后,写了一个完整库,并通过中间activity的方式,实现了与activity 的解耦,地址:https://github.com/sadpup/MiniPermission
欢迎拍砖!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值