import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import common from '@ohos.app.ability.common';
import { OnSdkEvent } from '../model/SignCallback';
import { PermissionGrantedEvent, PermissionDeniedEvent } from '../model/SdkEvent';
/**
* 运行时权限请求器(SDK 内部使用)。
*
* 在 Web 触发 `onPermissionRequest`(getUserMedia / 拍照 / 文件选择等)时,
* 把对应的鸿蒙权限通过 `requestPermissionsFromUser` 弹给用户,
* 并通过 `PermissionGranted` / `PermissionDenied` 事件回调通知客户。
*/
export class RuntimePermissionRequester {
/**
* 请求一组运行时权限。
*
* @param context UIAbility/页面 context
* @param permissions 鸿蒙权限名数组(如 `['ohos.permission.CAMERA']`)
* @param onEvent 可选的 SDK 事件回调
* @returns Promise<boolean> true=全部 grant; false=有任意被拒
*/
public static async request(
context: common.UIAbilityContext,
permissions: Permissions[],
onEvent?: OnSdkEvent
): Promise<boolean> {
if (permissions === null || permissions === undefined || permissions.length === 0) {
return true;
}
const permNames: string[] = permissions.map((p: Permissions) => String(p));
const emit = (granted: boolean): void => {
if (onEvent === undefined) {
return;
}
onEvent(granted
? new PermissionGrantedEvent(permNames)
: new PermissionDeniedEvent(permNames));
};
try {
const atManager = abilityAccessCtrl.createAtManager();
const grantStatus = await atManager.requestPermissionsFromUser(context, permissions);
const allGranted: boolean = grantStatus.authResults.every((r: number) => r === 0);
emit(allGranted);
return allGranted;
} catch (_e) {
emit(false);
return false;
}
}
/** Web 资源标识 → 鸿蒙权限的映射表。 */
private static readonly WEB_RESOURCE_TO_PERMISSION: Map<string, Permissions> = new Map<string, Permissions>([
['TYPE_VIDEO_CAPTURE', 'ohos.permission.CAMERA'],
['TYPE_AUDIO_CAPTURE', 'ohos.permission.MICROPHONE']
]);
/**
* 把 Web 资源标识(如 `TYPE_VIDEO_CAPTURE` / `TYPE_AUDIO_CAPTURE`)映射到鸿蒙权限名。
*
* @param webResources Web 端请求的资源类型字符串数组
* @returns 对应的鸿蒙权限数组(去重)
*/
public static mapWebResourcesToPermissions(webResources: string[]): Permissions[] {
const result: Permissions[] = [];
const seen: Set<string> = new Set<string>();
for (const resource of webResources) {
const perm: Permissions | undefined =
RuntimePermissionRequester.WEB_RESOURCE_TO_PERMISSION.get(resource);
if (perm !== undefined && !seen.has(perm)) {
seen.add(perm);
result.push(perm);
}
}
return result;
}
// ArkTS 类禁止实例化
private constructor() {}
}
|