// 同步方法,直接返回结果
fun checkPermission(context: Context, permission: String): Boolean {
return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
}
// 使用 ActivityResultLauncher 注册
val launcher = activity.registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
// 处理结果
}
// 触发权限请求
launcher.launch(arrayOf(permission1, permission2))
// 判断是否需要显示说明(用户之前拒绝过)
fun shouldShowRequestPermissionRationale(activity: Activity, permission: String): Boolean {
return activity.shouldShowRequestPermissionRationale(permission)
}
checkSelfPermission() 是同步方法// ❌ 问题:需要使用异步方法 checkAccessToken
// 当前实现是占位,返回 false
static checkPermission(context: Context, permission: string): boolean {
// TODO: 需要改为异步方法
// const tokenId = await atManager.getTokenId(context);
// const grantStatus = await atManager.checkAccessToken(tokenId, permission);
return false; // 占位实现
}
// 使用 abilityAccessCtrl.createAtManager()
const atManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(context, permissionsArray)
.then((data) => {
// 处理结果
});
// ❌ 错误:Permissions 类型未导出
atManager.requestPermissionsFromUser(context, permissionsArray as Array<abilityAccessCtrl.Permissions>)
// Error: Namespace 'abilityAccessCtrl' has no exported member 'Permissions'
// ❌ 错误:PermissionRequestResult 类型未导出
(atManager.requestPermissionsFromUser as (context: Context, permissions: Array<string>) => Promise<abilityAccessCtrl.PermissionRequestResult>)
// Error: Namespace 'abilityAccessCtrl' has no exported member 'PermissionRequestResult'
// ❌ 错误:不允许使用 any/unknown
// Error: Use explicit types instead of "any", "unknown" (arkts-no-any-unknown)
Permissions 和 PermissionRequestResult 类型未导出| 特性 | Android | HarmonyOS | 说明 |
|---|---|---|---|
| 权限检查 | 同步方法 | 异步方法 | HarmonyOS 需要异步检查 |
| 权限请求 | ActivityResultLauncher | Promise | 两种不同的异步处理方式 |
| 类型定义 | 完整 | 部分缺失 | HarmonyOS 类型定义不完整 |
| API 设计 | 清晰明确 | 存在类型问题 | HarmonyOS 需要类型断言 |
不要强行与 Android 保持一致,按照 HarmonyOS 官方推荐的方式实现:
权限检查改为异步方法
static async checkPermissionAsync(context: Context, permission: string): Promise<boolean> {
const atManager = abilityAccessCtrl.createAtManager();
const tokenId = await atManager.getTokenId(context);
const grantStatus = await atManager.checkAccessToken(tokenId, permission);
return grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;
}
权限请求使用官方示例的方式
简化接口设计
需要确认:
requestPermissionsFromUser 的正确参数类型Permissions 类型未导出PermissionRequestResult 类型未导出any/unknown 类型