开始从事Android开发工作,主要在Camera上进行学习与开发。Camera的开发经常涉及到权限的申请,而Android6.0之后增加了动态权限申请,作为一个小白,每次开发都需要查询文档申请权限太繁琐。故写一篇博客,作为权限静态注册与动态申请的一个笔记。
1 权限静态注册声明
一般需要申请的权限首先都需要在AndroidManifest.xml进行静态注册,以CAMERA为例,注册如下(如果需要保存照片,还需要读写SD卡的权限):
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.moral.firebasefacedetect">
<!-- 相机权限注册 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 用于读写存储卡 -->
<uses-feature android:name="android.hardware.camera.autocues" />
2 Android6.0之后动态权限申请
Andorid6.0之后的权限不仅要注册声明,还需要在程序运行时动态申请。
(1)需要申请的权限
为了统一对多个权限进行申请,将多个权限放入String[]中,在后面依次取出申请。
// 需要申请的权限集合
private static final String[] NEEDED_PERMISSIONS = new String[]
{
Manifest.permission.CAMERA, // 相机权限
... // 其他权限
}
(2)检查权限
对所有权限进行申请。
private boolen checkPermissions(String[] neededPermissions) {
if (neededPermissions == null || neededPermissions.length == 0) {
return true;
}
boolen allGranted = true;
for (String neededPermission : needPermissions) {
allGranted &= ContextCompat.checkSelfPermission(this, neededPermission) ==
PackageManager.PERMISSION_GRANTED;
}
return allGranted;
}
(3)权限检查结果与动态申请
检查权限是否全部申请。如果是,则开始相关代码;如果不是,则动态申请权限。
if (checkPermissions(NEEDED_PERMISSIONS)) {
// 如果全部权限已申请通过,则编写自己代码逻辑
initCamera(); // 比如初始化相机
} else {
// 动态申请权限
ActivityCompat.requestPermissions(this, NEEDED_PERMISSIONS, ACTION_REQUEST_CODE);
}
(4)权限动态申请结果
动态申请权限后,由用户决定是否授予权限。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[]grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == ACTION_REQUEST_CODE) {
boolen isAllGranted = true;
for (int grantResult : grantResults) {
isAllGranted &= (grantResult == PackageManager.PERMISSION_GRANTED);
}
if (isAllGranted) {
// 权限授予成功,写自己的代码逻辑
initCamera(); // 比如初始化相机
} else {
// 拒绝授予权限
}
}
}