欢迎使用CSDN-markdown编辑器

EasyPermission分析详解

既然要介绍Android权限封装库,不能不提前介绍下Android的权限管理内容。
1.权限相关首先和build target version相关,如果默认的target-ersion>=23,则程序中需要申请的权限则默认全部动态申请,即运行时申请;如果build target version<23,那么权限主要和用户手机的版本相关,如果用户手机版本低于6.0,则默认通过AndroidManifest文件赋予所有权限,如果>=6.0,则默认进行动态权限申请。

下面分析EasyPermissions源码,通过注释解释:

package test.jinesh.easypermissionslib;

import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;

import java.lang.reflect.Method;

/**
 * Utility class for asking permission
 * 作者信息介绍
 * @author Jinesh Francis
 */
public class EasyPermission {
    /**所有权限申请都统一使用的 请求码,这个数值可以随意设定
     * Request code for all permissions
     */
    private static final int MY_PERMISSIONS_REQUEST = 100;
    /**
     * 这里需要保存 申请权限的activity, 用于后面反射回调 权限申请后的回调
     * 说白了  就是申请权限后 成功怎么办 失败怎么办 的方法调用
     * Activity reference for reflection
     */
    private Activity runningActivity;

    /**
     * method to request permission
     * 申请权限调用这个方法 参数:activity 和申请的权限
     * @param runningActivity current activity reference
     * @param permission      permission to ask
     */
    public void requestPermission(Activity runningActivity, String permission) {
        this.runningActivity = runningActivity;
        //判断是有权限 如果有 返回PERMISSION_GRANTED
        if (ContextCompat.checkSelfPermission(runningActivity,
                permission)
                != PackageManager.PERMISSION_GRANTED) {
            //没有权限去申请权限
            ActivityCompat.requestPermissions(runningActivity,
                    new String[]{permission},
                    MY_PERMISSIONS_REQUEST);

        } else {
        //有权限 去执行相应函数
            callInterface(runningActivity, permission, true);
        }
    }

    /**
     * This method is called in onRequestPermissionsResult of the runningActivity
     * 这个方法在 申请权限的activity中onRequestPermissionsResult方法进行回调
     * @param requestCode  The request code of runningActivity.
     * @param permissions  The requested permissions of runningActivity.
     * @param grantResults The grant results for the corresponding permissions from runningActivity
     */
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
        //判断请求码  根据不同的请求码 决定不同的操作 这个对应上面请求的码
            case MY_PERMISSIONS_REQUEST: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        //如果被赋予权限 则执行相应的方法  就是获取了权限 可以继续 之前的进程
                    if (runningActivity != null) {
                        callInterface(runningActivity, permissions[0], true);
                    }

                } else {
                    if (runningActivity != null) {
                    //如果没有被赋予权限 则调用相应的方法去处理
                        callInterface(runningActivity, permissions[0], false);
                    }

                }
            }
        }
    }

    /**
     * Method to call OnPermissionResult interface
     * 申请权限后的事务处理,boolean 值 决定是否被赋予权限
     * @param activity   activity reference
     * @param permission current asked permission
     * @param isGranted  true if permission granted false otherwise
     * @throws InterfaceNotImplementedException throws when OnPermissionResult is not implemented
     */
    private void callInterface(Activity activity, String permission, boolean isGranted) throws InterfaceNotImplementedException {
        Method method;
        try {
        //通过反射获取 activity的方法
            method = activity.getClass().getMethod("onPermissionResult", String.class, boolean.class);
        } catch (NoSuchMethodException e) {
        //如果activity没有实现相关接口 则抛出异常   提示去实现接口
            throw new InterfaceNotImplementedException("please implement EasyPermission.OnPermissionResult interface in your activity to get the permissions result");
        }
        if (method != null) {
            try {
            //找到方法 进行调用
                method.invoke(activity, permission, isGranted);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Interface to notify permission result
     */
    public interface OnPermissionResult {
        /**
         * Method will get called after permission request
         * 回调接口  activity需要 继承实现 下面的方法 好在 权限申请后进行回调
         * @param permission asked permission
         * @param isGranted  true if permission granted false otherwise
         */
        void onPermissionResult(String permission, boolean isGranted);
    }

    /**
     * Exception throws when OnPermissionResult interface not implemented
     */
     //错误声明
    private class InterfaceNotImplementedException extends RuntimeException {
        private InterfaceNotImplementedException(String message) {
            super(message);
        }
    }
}

上面就是基本的代码 但是可以看出来其中还是有比较多的不足,比如在申请权限的时候没有判断系统是否还会给你 进行权限申请提示,因为如果用户拒绝了比较多次,这个弹窗下次是不会触发的,会产生问题。
其次没有进行 多次拒绝后 ,对用胡进行引导的提示,指引用户去 设置界面设置 权限。

另外附上 我总结的 权限流程图吧: 喜欢的别忘了点赞!:)
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值