Ability Kit 提供了一种允许应用访问系统资源(如:通讯录等)和系统能力(如:访问摄像头、麦克风等)的通用权限访问方式,来保护系统数据(包括用户个人数据)或功能,避免它们被不当或恶意使用。
应用权限保护的对象可以分为数据和功能:
- 数据 包括个人数据(如照片、通讯录、日历、位置等)、设备数据(如设备标识、相机、麦克风等)。
- 功能 包括设备功能(如访问摄像头/麦克风、打电话、联网等)、应用功能(如弹出悬浮窗、创建快捷方式等)。
系统采用 TokenID 作为应用的唯一标识。权限管理服务通过应用的 TokenID 来管理应用的 AT(Access Token)信息,包括应用身份标识 APP ID、子用户 ID、应用分身索引信息、应用 APL、应用权限授权状态等。在资源使用时,系统将通过 TokenID 作为唯一身份标识映射获取对应应用的权限授权状态信息,并依此进行鉴权,从而管控应用的资源访问行为。
系统支持多用户特性和应用分身特性,同一个应用在不同的子用户下和不同的应用分身下会有各自的 AT,这些 AT 的 TokenID 也是不同的。
授权方式
system_grant
(系统授权)
在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。
如果在应用中申请了 system_grant 权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。配置文件(module.json5)申请权限user_grant
(用户授权)
在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响。
该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。配置文件申请权限 + 运行时弹窗请求授权
常见权限
常见 系统授权 权限
权限 | 描述 |
---|---|
ohos.permission.INTERNET | 允许使用网络资源 |
ohos.permission.KEEP_BACKGROUND_RUNNING | 允许 Ability 在后台持续运行 |
ohos.permission.USE_BLUETOOTH | 允许应用查看蓝牙的配置 |
ohos.permission.PRINT | 允许应用获取打印框架的能力 |
ohos.permission.ACCELEROMETER | 允许应用读取加速度传感器的数据 |
ohos.permission.VIBRATE | 允许应用控制马达振动 |
常见 用户授权 权限
权限 | 描述 |
---|---|
ohos.permission.APP_TRACKING_CONSENT | 允许应用读取开放匿名设备标识符 |
ohos.permission.CAMERA | 允许应用使用相机 |
ohos.permission.DISTRIBUTED_DATASYNC | 允许不同设备间的数据交换 |
ohos.permission.APPROXIMATELY_LOCATION | 允许应用获取设备模糊位置信息 |
ohos.permission.LOCATION | 允许应用获取设备位置信息 |
ohos.permission.WRITE_MEDIA | 允许应用读写用户外部存储中的媒体文件信息 |
配置文件授权
用在申请权限时,需要在项目的配置文件(module.json5
)中,逐个声明需要的权限,否则应用将无法获取授权:
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.PERMISSION_NAME", //所有权限都必须声明权限名称
"reason": "$string:reason", //申请原因,user_grant 权限必需
"usedScene": {
//使用场景,user_grant 权限必需
"abilities": ["EntryAbility"], //哪些UIAbility中使用
"when": "inuse" //何时使用
}
}
]
}
}
向用户申请授权
当应用需要访问用户的隐私信息或使用系统能力时,例如获取位置信息、访问日历、使用相机拍摄照片或录制视频等,应该向用户请求授权,这部分权限是 user_grant
权限。
当应用申请 user_grant
权限时,需要完成以下步骤:
- 在配置文件(module.json5)中,声明应用需要请求的权限。
- 将应用中需要申请权限的目标对象与对应目标权限进行关联,让用户明确地知道,哪些操作需要用户向应用授予指定的权限。
- 运行应用时,在用户触发访问操作目标对象时应该调用接口,精准触发动态授权弹框。该接口的内部会检查当前用户是否已经授权应用所需的权限,如果当前用户尚未授予应用所需的权限,该接口会拉起动态授权弹框,向用户请求授权。
- 检查用户的授权结果,确认用户已授权才可以进行下一步操作。
每次执行需要目标权限的操作时,应用都必须使用
checkAccessToken()
函数检查自己是否已经具有该权限
每次访问受目标权限保护的接口之前,都需要使用requestPermissionsFromUser()
接口请求相应的权限
// 下面的代码可以运行在 Ability 启动时,或者某个 UI页面 启动时
import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit'
async checkPermissions() {
let permissions: Permissions[] = ["ohos.permission.CAMERA"]
let accessMgr = abilityAccessCtrl.createAtManager()
const flags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION;
const bundleInfo = await bundleManager.getBundleInfoForSelf(flags)
const grantStatus =
await accessMgr.checkAccessToken(bundleInfo.appInfo.accessTokenId, permissions[0])
if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
let results = await accessMgr.requestPermissionsFromUser(getContext(), permissions)
if (results.authResults[0] == 0) {
// 用户通过授权
} else {
// 用户拒绝授权
}
}
}