Android6.0动态权限获取详解

来源:互联网 发布:js获取指定的时间戳 编辑:程序博客网 时间:2024/05/19 23:56

在Android6.0出来之前,大家基本都是在清淡配置文件中间添加系统权限。但在Android6.0之后很多权限需要动态获取。如拍Sd卡的写入,写出、震动,等等。


这里为大家简单的介绍一下如何进行动态权限的获取,以及如何编写动态权限封装类。

这里以获取本地相机拍照为例。

一共两步,1、创建动态权限获取类。2、调用。

1、先创建一个动态权限的封装类PermissionTool.class
,已方便在其他类里面使用(不建议写在Acticity里面)

public class PermissionTool {    private Context context;
    final public static  int REQUEST_CODE_ASK_CAMERA = 125;//相机权限    final public static  int REQUEST_CODE_ASK_PHOTOS = 126;//相册权限    public PermissionTool(Context context) {        this.context = context;    }
//动态获取相机权限public boolean onCamera(){
    if (Build.VERSION.SDK_INT >= 23) {        int checkCallPhonePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA);
//注意这里是用于判断app是否以获取到了相应的权限,若没有。则申请获取。其中REQUEST_CODE_ASK_CAMERA相当于识别码,用于告诉Activity动态获取了相机权限,方便在Activity的onRequestPermissionsResult回调方法
if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions((Activity) context,new String[]{Manifest.permission.CAMERA},REQUEST_CODE_ASK_CAMERA); return false; }else{ //上面已经写好的拨号方法 return true; } } else { //上面已经写好的拨号方法 return true; }}//动态获取相册权限public boolean onPhotos(){ if (Build.VERSION.SDK_INT >= 23) {
        int checkCallPhonePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);        if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){            ActivityCompat.requestPermissions((Activity) context,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_CODE_ASK_PHOTOS);            return false;        }else{            return true;        }    } else {        return true;    }}
}
2、接下来就是调用
直接在需要的地方调用

PermissionTool permissionTool=new PermissionTool(this);
if(permissionTool.onCamera()){
//如果返回是true说明已有权限直接写你的逻辑代码
//如果返回是false,这时候Activity会在用户动态赋予app权限之后自动调用onRequestPermissionsResult()这个方法
}

//动态权限获取返回@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {    switch (requestCode) {//根据requestCode判断获取的是哪个权限,以便进行相应的处理        case REQUEST_CODE_ASK_PHOTOS://相册权限以获取            break;        case REQUEST_CODE_ASK_CAMERA://相机权限以获取                      break;        default:            super.onRequestPermissionsResult(requestCode, permissions, grantResults);    }}


BUT:

部分情况下可能会出现即使使用了onRequestPermissionsResult()之后,但在用户动态给了权限之后没用运行改方法

此时我们只需要让Activity继承ActivityCompat.OnRequestPermissionsResultCallback这个接口。 

原创粉丝点击