欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-17 09:35:46
...

开始从事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_PERMISSIONS);
}

(4)权限动态申请结果
动态申请权限后,由用户决定是否授予权限。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
	@NonNull int[]grantResults) {
	super.onRequestPermissionsResult(requestCode, permissions, grantResults);
	if (requestCode == ATION_REQUEST_PERMISSIONS) {
		boolen isAllGranted = true;
		for (int grantResult : grantResults) {
			isAllGranted &= (grantResult == PackageManager.PERMISSION_GRANTED);
		}
		
		if (isAllGranted) {
			// 权限授予成功,写自己的代码逻辑
			initCamera(); // 比如初始化相机
		} else {
			// 拒绝授予权限
		}
	}
}