#跟着坚果学鸿蒙# HarmonyOS 5 应用权限申请开发实践
·
一、HarmonyOS 5 权限管理概述
在 HarmonyOS 5 应用开发中,权限管理是保障用户隐私安全的核心机制。当应用需要访问系统敏感资源(如相机、位置、麦克风等)时,必须遵循"最小权限原则"并经过用户明确授权。HarmonyOS 5 的权限体系主要分为两类:
- **普通权限 (normal)**:系统自动授予,无需用户操作
- **敏感权限 (system_grant/user_grant)**:需要显式申请,部分由系统自动授予,部分需用户手动授权
本文将重点介绍需要用户授权的敏感权限申请流程,并提供完整的 ArkTS 实现示例。
二、权限申请开发流程
2.1 声明权限
首先在 module.json5
配置文件中声明需要的权限:
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.CAMERA",
"reason": "需要拍照功能",
"usedScene": {
"abilities": ["MainAbility"],
"when": "always"
}
},
{
"name": "ohos.permission.MICROPHONE",
"reason": "需要录制音频",
"usedScene": {
"abilities": ["MainAbility"],
"when": "always"
}
}
]
}
}
2.2 检查权限状态
在代码中检查当前是否已获得授权:
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
async function checkPermission(permission: string): Promise<boolean> {
try {
let atManager = abilityAccessCtrl.createAtManager();
let grantStatus = await atManager.checkAccessToken(
abilityAccessCtrl.AccessTokenID.INVALID_TOKEN,
permission
);
return grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;
} catch (err) {
console.error(`checkPermission failed, code is ${err.code}, message is ${err.message}`);
return false;
}
}
2.3 请求权限
如果未授权,则需要向用户请求权限:
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
import common from '@ohos.app.ability.common';
import promptAction from '@ohos.promptAction';
async function requestPermission(context: common.Context, permission: string): Promise<boolean> {
try {
let atManager = abilityAccessCtrl.createAtManager();
await atManager.requestPermissionsFromUser(
context,
[permission]
);
// 再次检查权限状态
return await checkPermission(permission);
} catch (err) {
console.error(`requestPermission failed, code is ${err.code}, message is ${err.message}`);
promptAction.showToast({ message: '权限申请失败: ' + err.message });
return false;
}
}
三、完整示例:相机权限申请
下面是一个完整的相机权限申请与使用的 ArkUI 示例:
@Entry
@Component
struct CameraPermissionExample {
@State hasCameraPermission: boolean = false
@State cameraStatus: string = '未授权'
private context = getContext(this) as common.UIAbilityContext
// 检查并申请相机权限
async requestCameraPermission() {
// 先检查是否已有权限
const isGranted = await checkPermission('ohos.permission.CAMERA')
if (isGranted) {
this.hasCameraPermission = true
this.cameraStatus = '已授权'
promptAction.showToast({ message: '已有相机权限' })
return
}
// 请求权限
const result = await requestPermission(this.context, 'ohos.permission.CAMERA')
this.hasCameraPermission = result
this.cameraStatus = result ? '已授权' : '未授权'
if (!result) {
promptAction.showToast({ message: '用户拒绝了相机权限' })
}
}
build() {
Column() {
Text('相机权限状态: ' + this.cameraStatus)
.fontSize(20)
.margin(10)
Button('申请相机权限')
.width(200)
.height(50)
.margin(10)
.onClick(() => {
this.requestCameraPermission()
})
if (this.hasCameraPermission) {
Button('打开相机')
.width(200)
.height(50)
.margin(10)
.backgroundColor('#007DFF')
.onClick(() => {
// 这里可以添加打开相机的逻辑
promptAction.showToast({ message: '相机已打开' })
})
}
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}
四、最佳实践建议
- 按需申请:仅在真正需要时才申请权限,避免应用启动时一次性申请所有权限
- 解释原因:在
module.json5
中清晰说明权限用途 (reason
字段) - 优雅降级:当权限被拒绝时,应用应能继续运行核心功能
- 权限检查:关键操作前都应检查权限状态,因为用户可能随时更改权限设置
- 权限组管理:HarmonyOS 5 将权限分组管理,授予组内某个权限会自动授予同组其他权限
五、总结
HarmonyOS 5 的权限系统设计既保护了用户隐私,又为开发者提供了清晰的API接口。通过本文的示例代码,开发者可以快速掌握权限申请的核心流程,并在实际开发中构建更安全、用户友好的应用。
更多推荐
所有评论(0)