Skip to content

权限声明与授权

鸿蒙权限声明: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 请求"