android6.0动态授权

关于android6.0动态权限

写篇博客记录以备用

实现代码

import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.util.Log;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 *  执行动态权限方法工具类
 * Created by zhoucl on 2016/11/30.
 */
public class PermissionUtil {
    public static final String TAG = PermissionUtil.class.getSimpleName();
    public static final int PERMISSION_REQUEST_CODE = 100;
    private Activity mActivity;
    private Object thisObj;
    /**
     * 执行动态权限方法工具类
     * @param thisObj   需要使用动态授权的类
     * @param mActivity 用于调起授权界面
     */
    public PermissionUtil(Object thisObj, Activity mActivity) {
        this.mActivity = mActivity;
        this.thisObj = thisObj;
    }
    /**
     * 需要执行的方法
     */
    private Method method;
    /**
     * 需要用户授予的权限
     */
    private HashMap<String, String> needPermissionInfo = new HashMap<>();
    /**
     * 加载权限,不行执行方法
     */
    public void loadPermission(String[] needPermission, String[] needPermissionNote) {
        doExecuteNeedPermissionMethod(null, needPermission, needPermissionNote);
    }
    /**
     * 加载权限,不行执行方法
     */
    public void loadPermission(ManifestEnum... manifestEnums) {
        executeNeedPermissionMethod(null, manifestEnums);
    }
    /**
     * 执行方法,并授权
     * @param methodName    需要授权的方法
     * @param manifestEnums 需要的权限
     */    
     public void executeNeedPermissionMethod(String methodName, ManifestEnum...manifestEnums) {
        if (manifestEnums != null && manifestEnums.length > 0) {
            String[] needPermission = new String[manifestEnums.length];
            String[] needPermissionNote = new String[manifestEnums.length];
            for (int i = 0; i < manifestEnums.length; i++) {
                needPermission[i] = manifestEnums[i].getPermissionName();
                needPermissionNote[i] = manifestEnums[i].getPermissionNote();
            }
            executeNeedPermissionMethod(methodName, needPermission, needPermissionNote);
        }
    }

    /**
     * 执行方法,并授权
     * @param methodName     需要授权的方法
     * @param needPermission 需要的权限
     * @param needPermissionNote 需要的权限描述
     */
    public void executeNeedPermissionMethod(String methodName, String[] needPermission, String[] needPermissionNote) {
        Method permissionMethod = getPermissionMethod(methodName);
        if (permissionMethod != null) {
            doExecuteNeedPermissionMethod(permissionMethod, needPermission, needPermissionNote);
        } else {

        }
    }

    private Method getPermissionMethod(String methodName) {
        try {
            return thisObj.getClass().getDeclaredMethod(methodName);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 执行需要权限的方法
     *
     * @param method         方法
     * @param needPermission 该方法执行需要的权限
     */
    private void doExecuteNeedPermissionMethod(Method method, String[] needPermission, String[] needPermissionNote) {
        if (needPermission == null || needPermissionNote == null || needPermission.length < 1 || needPermissionNote.length < 1) {
            Log.e(TAG, "您没有申请执行该方法需要的权限");
            return;
        }
        if (needPermission.length != needPermissionNote.length) {
            Log.e(TAG, "权限数据与权限说明数据要保持一致");
            return;
        }
        needPermissionInfo.clear();
        for (int i = 0; i < needPermission.length; i++) {
            needPermissionInfo.put(needPermission[i], needPermissionNote[i]);
        }
        try {
            this.method = method;
            this.method.setAccessible(true);
            if (needPermission.length > 0) {
                List<String> permissionsNeeded = new ArrayList<String>();
                final List<String> permissionsList = new ArrayList<String>();

                for (String permission : needPermission) {
                    if (!addPermission(permissionsList, permission))
                        permissionsNeeded.add(permission);
                }
                if (permissionsList.size() > 0) {
                    ActivityCompat.requestPermissions(mActivity, permissionsList.toArray(new String[permissionsList.size()]), PERMISSION_REQUEST_CODE);
                } else {
                    invokeCurrentPermissionMethod();
                }
            } else {
                invokeCurrentPermissionMethod();
            }
        } catch (Exception e) {
            e.printStackTrace();
//            LogUtil.e("没有找到" + methodName + "方法");
        }
    }

    private void invokeCurrentPermissionMethod() {
        if (method != null) {
            try {
                method.invoke(thisObj);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }

    private boolean addPermission(List<String> permissionsList, String permission) {
        if (ActivityCompat.checkSelfPermission(mActivity, permission) != PackageManager.PERMISSION_GRANTED) {
            permissionsList.add(permission);
            if (!ActivityCompat.shouldShowRequestPermissionRationale(mActivity, permission))
                return false;
        }
        return true;
    }

    public boolean checkPermission(String permission) {
        return ActivityCompat.checkSelfPermission(mActivity, permission) == PackageManager.PERMISSION_GRANTED;
    }

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE: {//int[] grantResults
                List<String> notPass = new ArrayList<>();
                for (int i = 0; i < permissions.length; i++) {
                    if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {// 不通过
                        notPass.add(permissions[i]);
                    }
                }
                if (notPass.size() > 0) {
                    String message = "您没有授予APP " + needPermissionInfo.get(notPass.get(0));
                    for (int i = 1; i < notPass.size(); i++) {
                        message = message + ", " + needPermissionInfo.get(notPass.get(i));
                    }
                    message += " 权限,某些功能可能无法正常使用。";
                    new AlertDialog.Builder(mActivity)
                            .setTitle("温馨提示")
                            .setMessage(message)
                            .setNegativeButton("我知道了", null)
                            .create()
                            .show();
//                    new AlertDialog(activity).builder()
//                            .setTitle("温馨提示")
//                            .setMsg(message)
//                            .setNegativeButton("我知道了",null)
//                            .show();
                    //executeNeedPermissionMethod(methodName,needPermission);
                } else {
                    if (method != null) {
                        invokeCurrentPermissionMethod();
                    }
                }
            }
            break;
        }
    }
}

需要动态获取权限枚举类

package com.yft.common.util;

import android.Manifest;

/**
 * Created by zhoucl on 2016/11/30.
 */
public enum ManifestEnum {

    READ_CALENDAR               (Manifest.permission.READ_CALENDAR          , "读取日程提醒"      , "允许程序读取用户的日程信息"),
    WRITE_CALENDAR              (Manifest.permission.WRITE_CALENDAR         , "写入日程提醒"      , "写入日程,但不可读取"),
    READ_CONTACTS               (Manifest.permission.READ_CONTACTS          , "读取联系人"        , "允许应用访问联系人通讯录信息"),
    WRITE_CONTACTS              (Manifest.permission.WRITE_CONTACTS         , "写入联系人"        , "写入联系人,但不可读取"),
    GET_ACCOUNTS                (Manifest.permission.GET_ACCOUNTS           , "访问账户Gmail列表" , "访问GMail账户列表"),
    ACCESS_FINE_LOCATION        (Manifest.permission.ACCESS_FINE_LOCATION   , "获取精确位置"      , "通过GPS芯片接收卫星的定位信息,定位精度达10米以内"),
    ACCESS_COARSE_LOCATION      (Manifest.permission.ACCESS_COARSE_LOCATION , "获取错略位置"      , "通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米"),
    RECORD_AUDIO                (Manifest.permission.RECORD_AUDIO           , "录音"             , "录制声音通过手机或耳机的麦克"),
    READ_PHONE_STATE            (Manifest.permission.READ_PHONE_STATE       , "读取电话状态"      , "访问电话状态"),
    CALL_PHONE                  (Manifest.permission.CALL_PHONE             , "拨打电话"          , "允许程序从非系统拨号器里输入电话号码"),
    READ_CALL_LOG               (Manifest.permission.READ_CALL_LOG          , "读取通话记录"      , "读取通话记录"),
    WRITE_CALL_LOG              (Manifest.permission.WRITE_CALL_LOG         , "写入通话记录"      , "写入通话记录"),
    ADD_VOICEMAIL               (Manifest.permission.ADD_VOICEMAIL          , "添加语音邮件"      , "允许应用程序添加系统中的语音邮件"),
    USE_SIP                     (Manifest.permission.USE_SIP                , "使用SIP视频"       , "允许程序使用SIP视频服务"),
    PROCESS_OUTGOING_CALLS      (Manifest.permission.PROCESS_OUTGOING_CALLS , "处理拨出电话"       , "允许程序监视,修改或放弃播出电话"),
    BODY_SENSORS                (Manifest.permission.BODY_SENSORS           , "传感器"            , "传感器"),
    SEND_SMS                    (Manifest.permission.SEND_SMS               , "发送短信"          , "发送短信"),
    RECEIVE_SMS                 (Manifest.permission.RECEIVE_SMS            , "接收短信"          , "接收短信"),
    READ_SMS                    (Manifest.permission.READ_SMS               , "读取短信内容"       , "读取短信内容"),
    RECEIVE_WAP_PUSH            (Manifest.permission.RECEIVE_WAP_PUSH       , "接收WapPush"       , "接收WapPush"),
    RECEIVE_MMS                 (Manifest.permission.RECEIVE_MMS            , "接收彩信"          , "接收彩信"),
    READ_EXTERNAL_STORAGE       (Manifest.permission.READ_EXTERNAL_STORAGE  , "读取存储卡"         , "读取存储卡"),
    WRITE_EXTERNAL_STORAGE      (Manifest.permission.WRITE_EXTERNAL_STORAGE , "写入存储卡"         , "写入存储卡"),
    CAMERA                      (Manifest.permission.CAMERA                 , "拍照"              , "允许访问摄像头进行拍照");

    /**
     * 权限名称
     */
    private final String permissionName;
    /**
     * 权限说明
     */
    private final String permissionNote;
    /**
     * 权限描述
     */
    private final String permissionDescribe;

    ManifestEnum(String permissionName, String permissionNote, String permissionDescribe) {
        this.permissionName = permissionName;
        this.permissionNote = permissionNote;
        this.permissionDescribe = permissionDescribe;
    }

    public String getPermissionName() {
        return permissionName;
    }

    public String getPermissionNote() {
        return permissionNote;
    }

    public String getPermissionDescribe() {
        return permissionDescribe;
    }
}

使用方式

//在Activity中创建工具类,并设置为成员变量
PermissionUtil permissionUtil = new PermissionUtil(this,this);
// 复写Activity的onRequestPermissionsResult方法
@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        permissionUtil.onRequestPermissionsResult(requestCode,permissions,grantResults);
    }
 // 调用方式
 permissionUtil.executeNeedPermissionMethod("camera", ManifestEnum.CAMERA);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值