最近在android手机打开UC浏览器时,经常冒出是否允许XX权限:android 6.0之前没有看到这种权限管理,本文就研究下下android最新的权限管理。
1.概述
官方API:
https://developer.android.com/training/permissions/requesting.html
官方示例:
https://github.com/googlesamples/android-RuntimePermissions
在android6.0版本后(API:23),当APP运行时,用户授予权限,而不再像旧版本中在安装时给予所有请求权限。这种方法简化了APP的安装过程,因为它们不需要在安装或更新时授予权限。这也给用户更多的控制APP。
系统权限分为两个权限类别,普通权限(normal)和敏感权限(dangerous):
(1)普通权限不直接对用的隐私有风险。如果你在manifest中列出普通权限,系统将自动授予这些权限。
(2)敏感权限可以给app进入用户的私密数据。如果你列出敏感权限在manifest
中,用户必须明确的给予授权同意。
敏感权限权限总共9组,每组只要有一个权限申请成功,则默认整组权限可以使用:
(1)group:android.permission-group.CALENDAR(日历权限)
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
(2) group:android.permission-group.CAMERA(相机权限)
permission:android.permission.CAMERA
(3) group:android.permission-group.CONTACTS(联系人权限)
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
(4) group: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
(5) group:android.permission-group.SENSORS(传感器权限)
permission:android.permission.BODY_SENSORS
(6)group:android.permission-group.LOCATION(位置权限)
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
(7)group:android.permission-group.STORAGE(存储权限)
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
(8) group:android.permission-group.MICROPHONE(麦克风权限)
permission:android.permission.RECORD_AUDIO
(9) group: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
普通权限在AndroidManifest.xml中列出就可以,普通具体查看:
官方链接
2.实战
(1)首先对android版本进行判断
public void showCamera(View view) {
//首先判断android版本
if (Build.VERSION.SDK_INT >= 23) {
// 检查相机权限是否已经获取
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 相机权限没有被授权,请求权限
requestCameraPermission();
} else {
// 相机权限已经授权直接使用
showCameraPreview();
}
}
}
(2)请求相机权限
private void requestCameraPermission() {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
Snackbar.make(mLayout, R.string.permission_camera_rationale,
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA);
}
})
.show();
} else {
// 相机权限没有授权,请求回调
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA);
}
// END_INCLUDE(camera_permission_request)
}
(3)拒绝权限后请求回调函数onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_CALL_PHONE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted
callDirectly(mobile);
} else {
// Permission Denied
Toast.makeText(MainActivity.this, "CALL_PHONE Denied", Toast.LENGTH_SHORT)
.show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
这里会对提供了一个对用户点击做判断的入口,开发者可以根据 grantResults[0] 的类型,来判断用户点击的是允许还是拒绝,接着就可以执行相应的逻辑了。