Android 6.0(API 23)开始,系统权限分为两类:正常权限和危险权限。
正常权限不会不会给用户隐私带来风险,应用清单中如果列出了正常权限,系统会自动授予正常权限。
危险权限会授予应用访问用户机密数据的权限,应用清单中如果列出了危险权限,必须用户明确批准应用使用这些权限。
如果设备运行的是Android5.1或者更低的版本(API 22-),使用危险权限必须在应用清单中申请,且用户必须在安装时授予此权限,如果不授予权限,应用无法安装。
如果设备运行的是Android6.0或者更高的版本(API 23+),使用危险权限必须在应用清单中申请,但用户不必须在安装时授予权限,拒绝权限时仍可以继续运行有限的功能。应用必须在运行时请求每项危险权限。
检查权限:
int checkSelfPermission (Context context, String permission)
eg:
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);
返回值为PackageManager.PERMISSION_GRANTED(具有权限)
PERMISSION_DENIED(不具有权限)
shouldShowRequestPermissionRationale()
如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don't ask again 选项,此方法将返回 false。如果设备规范禁止应用具有该权限,此方法也会返回 false。
void requestPermissions (Activity activity, String[] permissions, int requestCode)
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
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.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
使用Android权限的原则:
1.只申请那些有必要的权限
2.如果有addtional libraries,需要注意libraries所需要的权限
3.权限对用户保持透明,即在需要的时候申请权限
4.使系统权限明确,对敏感功能提供连续的指示?
网友评论