Android 6.0权限管理与申请

来源:互联网 发布:淘宝云客服门户 编辑:程序博客网 时间:2024/06/15 18:39

android6.0之后为了保护用户隐私,一些权限是需要在程序运行时动态检测并需要用户手动设置是否给与这些权限。
权限分为:
normal permissions:在清单文件中添加就行了。
dangerous permissions:即使在清单文件中添加了,也需要在运行时通过用户授权。
下面看下dangerous permissions有哪些:

group:android.permission-group.CONTACTS  permission:android.permission.WRITE_CONTACTS  permission:android.permission.GET_ACCOUNTS  permission:android.permission.READ_CONTACTSgroup:android.permission-group.PHONE  permission:android.permission.READ_CALL_LOG  permission:android.permission.READ_PHONE_STATE  permission:android.permission.CALL_PHONE  permission:android.permission.WRITE_CALL_LOG  permission:android.permission.USE_SIP  permission:android.permission.PROCESS_OUTGOING_CALLS  permission:com.android.voicemail.permission.ADD_VOICEMAILgroup:android.permission-group.CALENDAR  permission:android.permission.READ_CALENDAR  permission:android.permission.WRITE_CALENDARgroup:android.permission-group.CAMERA  permission:android.permission.CAMERAgroup:android.permission-group.SENSORS  permission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATION  permission:android.permission.ACCESS_FINE_LOCATION  permission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGE  permission:android.permission.READ_EXTERNAL_STORAGE  permission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONE  permission:android.permission.RECORD_AUDIOgroup:android.permission-group.SMS  permission:android.permission.READ_SMS  permission:android.permission.RECEIVE_WAP_PUSH  permission:android.permission.RECEIVE_MMS  permission:android.permission.RECEIVE_SMS  permission:android.permission.SEND_SMS  permission:android.permission.READ_CELL_BROADCASTS

这些权限组里面有很多权限,只要该权限组中有一个权限被allow,那么该组的所有权限都会被allow。
具体使用:

一、在第一次需要dangerous权限的地方检查权限是否授权:

if (ContextCompat.checkSelfPermission(Activity activity, android.Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED){            //申请授权        }else{            //        }

PackageManager.PERMISSION_GRANTED表示已授权。
PackageManager.PERMISSION_DENIED表示未授权。

二、申请授权:

ActivityCompat.requestPermissions(Activity activity,new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, int REQUEST_CODE);

第一个参数:activity对象;
第二个参数:需要申请授权的权限数组;
第三个参数:用于 回调时候检测;
通过第二个参数可以看出可以一次性申请多个权限

三、处理权限申请的回调:

@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);    switch(requestCode){        case REQUEST_CODE: {            if (grantResults.length > 0                && grantResults[权限下标] == PackageManager.PERMISSION_GRANTED) {    //说明该下标对应的权限申请成功    //有多少个权限需要申请,grantResults的长度就等于多少,且grantResults数组元素的值分别对应于每个权限申请的结果。            } else {   //该权限申请失败            }            return;    }    }

以上就是权限申请的步骤了,然后添加几个api介绍:

if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,Manifest.permission.READ_CONTACTS))     // Show an expanation to the user *asynchronously* -- don't block    // this thread waiting for the user's response! After the user    // sees the explanation, try again to request the permission.}

这个方法的作用是在上次用户已经拒绝这个权限申请后再次需要申请这个权限是,需要给用户一个解释,向用户展示一个提示框为什么需要这个权限。
那么合在一起的写法就是:
如果这个权限没有获取,先判断这个权限是否之前被拒绝过,如果拒绝过就弹个解释框,如果没拒绝过就去申请这个权限。然后在申请权限的回调中去坐相应的业务处理。

封装:也是借鉴hongyang和其他大神的博客然后自己的理解之后的一些封装。

原创粉丝点击