权限处理方式对比.md 5.3 KB

Android vs HarmonyOS 权限处理方式对比

一、Android 权限处理方式

1. 权限检查

// 同步方法,直接返回结果
fun checkPermission(context: Context, permission: String): Boolean {
    return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
}

2. 权限请求

// 使用 ActivityResultLauncher 注册
val launcher = activity.registerForActivityResult(
    ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
    // 处理结果
}

// 触发权限请求
launcher.launch(arrayOf(permission1, permission2))

3. 权限说明

// 判断是否需要显示说明(用户之前拒绝过)
fun shouldShowRequestPermissionRationale(activity: Activity, permission: String): Boolean {
    return activity.shouldShowRequestPermissionRationale(permission)
}

特点:

  • 同步权限检查checkSelfPermission() 是同步方法
  • 基于 ActivityResult API:使用现代 Android 权限请求方式
  • 类型明确:所有类型都有明确的定义
  • 简单直接:API 设计清晰,易于使用

二、HarmonyOS 权限处理方式

1. 权限检查

// ❌ 问题:需要使用异步方法 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; // 占位实现
}

2. 权限请求

// 使用 abilityAccessCtrl.createAtManager()
const atManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(context, permissionsArray)
    .then((data) => {
        // 处理结果
    });

3. 当前问题

问题 1:类型定义缺失

// ❌ 错误:Permissions 类型未导出
atManager.requestPermissionsFromUser(context, permissionsArray as Array<abilityAccessCtrl.Permissions>)
// Error: Namespace 'abilityAccessCtrl' has no exported member 'Permissions'

问题 2:返回类型缺失

// ❌ 错误:PermissionRequestResult 类型未导出
(atManager.requestPermissionsFromUser as (context: Context, permissions: Array<string>) => Promise<abilityAccessCtrl.PermissionRequestResult>)
// Error: Namespace 'abilityAccessCtrl' has no exported member 'PermissionRequestResult'

问题 3:ArkTS 严格类型检查

// ❌ 错误:不允许使用 any/unknown
// Error: Use explicit types instead of "any", "unknown" (arkts-no-any-unknown)

特点:

  • 异步权限检查:需要使用异步方法,但当前是占位实现
  • Promise 方式:使用 Promise 处理异步结果
  • 类型定义问题PermissionsPermissionRequestResult 类型未导出
  • API 文档不完整:类型定义与运行时行为不一致

三、核心差异总结

特性 Android HarmonyOS 说明
权限检查 同步方法 异步方法 HarmonyOS 需要异步检查
权限请求 ActivityResultLauncher Promise 两种不同的异步处理方式
类型定义 完整 部分缺失 HarmonyOS 类型定义不完整
API 设计 清晰明确 存在类型问题 HarmonyOS 需要类型断言

四、建议的处理方案

方案 1:按照 HarmonyOS 推荐方式实现(推荐)

不要强行与 Android 保持一致,按照 HarmonyOS 官方推荐的方式实现:

  1. 权限检查改为异步方法

    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;
    }
    
  2. 权限请求使用官方示例的方式

    • 查看官方文档中的示例代码
    • 使用官方推荐的类型处理方式
    • 如果官方示例使用了类型断言,我们也使用相同的方式
  3. 简化接口设计

    • 不强制与 Android 接口一致
    • 按照 HarmonyOS 的 API 特性设计接口
    • 在业务层做适配,而不是在基础层强行统一

方案 2:查看官方文档确认正确类型

根据官方文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-abilityaccessctrl#requestpermissionsfromuser9

需要确认:

  1. requestPermissionsFromUser 的正确参数类型
  2. 返回值的正确类型
  3. 官方示例代码中的处理方式

五、当前编译错误

  1. Permissions 类型未导出
  2. PermissionRequestResult 类型未导出
  3. ❌ ArkTS 不允许使用 any/unknown 类型
  4. ❌ 权限检查方法是占位实现(返回 false)

六、下一步行动

  1. 查看官方文档示例代码,确认正确的使用方式
  2. 按照 HarmonyOS 推荐方式实现,不要强行与 Android 保持一致
  3. 简化接口设计,适配 HarmonyOS 的 API 特性
  4. 修复类型问题,使用官方推荐的类型处理方式