<

{{title}}

{{file.summary.functions.pct}}%

Functions
{{file.summary.functions.covered}}/{{file.summary.functions.total}}

{{file.summary.branches.pct}}%

Branches
{{file.summary.branches.covered}}/{{file.summary.branches.total}}

{{file.summary.lines.pct}}%

Lines
{{file.summary.lines.covered}}/{{file.summary.lines.total}}
          
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                
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() {} 
} 

              
Code coverage generated by bjc at {{date}}