天天看点

关于Android6.0后动态申请权限的笔记

开始从事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 {
			// 拒绝授予权限
		}
	}
}