# Android vs HarmonyOS 权限处理方式对比 ## 一、Android 权限处理方式 ### 1. 权限检查 ```kotlin // 同步方法,直接返回结果 fun checkPermission(context: Context, permission: String): Boolean { return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED } ``` ### 2. 权限请求 ```kotlin // 使用 ActivityResultLauncher 注册 val launcher = activity.registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> // 处理结果 } // 触发权限请求 launcher.launch(arrayOf(permission1, permission2)) ``` ### 3. 权限说明 ```kotlin // 判断是否需要显示说明(用户之前拒绝过) fun shouldShowRequestPermissionRationale(activity: Activity, permission: String): Boolean { return activity.shouldShowRequestPermissionRationale(permission) } ``` ### 特点: - ✅ **同步权限检查**:`checkSelfPermission()` 是同步方法 - ✅ **基于 ActivityResult API**:使用现代 Android 权限请求方式 - ✅ **类型明确**:所有类型都有明确的定义 - ✅ **简单直接**:API 设计清晰,易于使用 --- ## 二、HarmonyOS 权限处理方式 ### 1. 权限检查 ```typescript // ❌ 问题:需要使用异步方法 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. 权限请求 ```typescript // 使用 abilityAccessCtrl.createAtManager() const atManager = abilityAccessCtrl.createAtManager(); atManager.requestPermissionsFromUser(context, permissionsArray) .then((data) => { // 处理结果 }); ``` ### 3. 当前问题 #### 问题 1:类型定义缺失 ```typescript // ❌ 错误:Permissions 类型未导出 atManager.requestPermissionsFromUser(context, permissionsArray as Array) // Error: Namespace 'abilityAccessCtrl' has no exported member 'Permissions' ``` #### 问题 2:返回类型缺失 ```typescript // ❌ 错误:PermissionRequestResult 类型未导出 (atManager.requestPermissionsFromUser as (context: Context, permissions: Array) => Promise) // Error: Namespace 'abilityAccessCtrl' has no exported member 'PermissionRequestResult' ``` #### 问题 3:ArkTS 严格类型检查 ```typescript // ❌ 错误:不允许使用 any/unknown // Error: Use explicit types instead of "any", "unknown" (arkts-no-any-unknown) ``` ### 特点: - ❌ **异步权限检查**:需要使用异步方法,但当前是占位实现 - ✅ **Promise 方式**:使用 Promise 处理异步结果 - ❌ **类型定义问题**:`Permissions` 和 `PermissionRequestResult` 类型未导出 - ❌ **API 文档不完整**:类型定义与运行时行为不一致 --- ## 三、核心差异总结 | 特性 | Android | HarmonyOS | 说明 | |------|---------|-----------|------| | **权限检查** | 同步方法 | 异步方法 | HarmonyOS 需要异步检查 | | **权限请求** | ActivityResultLauncher | Promise | 两种不同的异步处理方式 | | **类型定义** | 完整 | 部分缺失 | HarmonyOS 类型定义不完整 | | **API 设计** | 清晰明确 | 存在类型问题 | HarmonyOS 需要类型断言 | --- ## 四、建议的处理方案 ### 方案 1:按照 HarmonyOS 推荐方式实现(推荐) **不要强行与 Android 保持一致**,按照 HarmonyOS 官方推荐的方式实现: 1. **权限检查改为异步方法** ```typescript static async checkPermissionAsync(context: Context, permission: string): Promise { 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. **修复类型问题**,使用官方推荐的类型处理方式