Appearance
权限声明与授权
鸿蒙权限声明:module.json5 配置、运行时授权流程。
1. 权限声明
1.1 module.json5 配置
json5
// entry/src/main/module.json5
{
"module": {
"name": "entry",
"type": "entry",
"description": "$string:module_desc",
"mainElement": "EntryAbility",
"deviceTypes": ["phone", "tablet"],
"deliveryWithInstall": true,
// 权限声明
"requestPermissions": [
{
"name": "ohos.permission.INTERNET",
"reason": "$string:internet_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "always"
}
},
{
"name": "ohos.permission.CAMERA",
"reason": "$string:camera_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
},
{
"name": "ohos.permission.LOCATION",
"reason": "$string:location_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
},
{
"name": "ohos.permission.READ_MEDIA",
"reason": "$string:read_media_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
}
}1.2 权限分类
| 分类 | 说明 | 授权方式 |
|---|---|---|
| 普通权限 | 低风险权限 | 安装时自动授予 |
| 用户授权权限 | 敏感权限 | 运行时请求用户授权 |
| 系统权限 | 系统级权限 | 系统应用自动授予 |
| 签名权限 | 同签名应用 | 签名验证后授予 |
2. 运行时授权
2.1 授权流程
应用请求权限
↓
系统检查权限类型
↓
普通权限 → 自动授予
用户授权权限 → 弹出授权对话框
↓
用户选择 允许/拒绝
↓
系统记录授权状态
↓
应用检查授权结果2.2 授权代码
typescript
import { bundleManager } from '@kit.ArkTS'
import { securityAccessToken } from '@kit.SecurityKit'
class PermissionManager {
// 检查并请求权限
async checkAndRequest(permission: string): Promise<boolean> {
// 1. 检查是否已授权
let status = securityAccessToken.verifyAccessToken({
permissionName: permission
})
if (status === securityAccessToken.GrantStatus.PERMISSION_GRANTED) {
console.log('权限已授予:', permission)
return true
}
// 2. 请求用户授权
try {
let granted = await bundleManager.requestPermission({
permission: permission
})
if (granted) {
console.log('用户已授权:', permission)
return true
} else {
console.log('用户拒绝授权:', permission)
this.showPermissionDeniedDialog(permission)
return false
}
} catch (err) {
console.error('权限请求失败:', err.message)
return false
}
}
// 批量请求权限
async requestPermissions(permissions: string[]): Promise<Map<string, boolean>> {
let results = new Map<string, boolean>()
for (let perm of permissions) {
let granted = await this.checkAndRequest(perm)
results.set(perm, granted)
}
return results
}
// 显示权限被拒对话框
private showPermissionDeniedDialog(permission: string): void {
// 提示用户去设置页授权
// 或说明为什么需要此权限
}
}
// 使用
let permManager = new PermissionManager()
let hasCamera = await permManager.checkAndRequest('ohos.permission.CAMERA')3. 权限使用场景
3.1 常用权限
typescript
// 网络权限
"ohos.permission.INTERNET" // 访问网络
// 相机权限
"ohos.permission.CAMERA" // 使用相机
// 位置权限
"ohos.permission.LOCATION" // 获取位置
"ohos.permission.LOCATION_IN_BACKGROUND" // 后台定位
// 存储权限
"ohos.permission.READ_MEDIA" // 读取媒体文件
"ohos.permission.WRITE_MEDIA" // 写入媒体文件
// 麦克风权限
"ohos.permission.MICROPHONE" // 使用麦克风
// 通知权限
"ohos.permission.NOTIFICATION" // 发送通知4. 面试高频考点
Q1: 权限声明在哪里配置?
回答:module.json5 的 requestPermissions 数组,包含 name、reason、usedScene。
Q2: 运行时如何请求权限?
回答:bundleManager.requestPermission({ permission }),返回 Promise<boolean>。
🐱 小猫提示:权限声明记住 "module.json5 配置、requestPermissions、运行时 requestPermission 请求"。