文档管理中心
FAQ应用框架开发Web框架Web开发(ArkWeb)如何根据Web中的权限请求去动态申请权限

如何根据Web中的权限请求去动态申请权限

问题现象

如何根据Web的onPermissionRequest回调方法监听网页请求了什么权限,然后通过atManager.requestPermissionsFromUser统一申请权限。

背景知识

解决方案

通过Web组件的onPermissionRequest回调方法返回值event.request.getAccessibleResource()获取网页所请求的权限资源列表,随后遍历判断具体的资源类型,添加对应的权限,生成权限列表传给atManager.requestPermissionsFromUser统一申请权限。

具体步骤如下:

  1. 允许应用使用相机时需添加相机权限:ohos.permission.CAMERA,允许应用使用麦克风时需添加麦克风权限:ohos.permission.MICROPHONE,具体申请方式请参考声明权限
  2. 根据Web中的权限请求向用户手动授权,示例代码如下:
    收起
    自动换行
    深色代码主题
    复制
    1. import { webview } from '@kit.ArkWeb';
    2. import { BusinessError } from '@kit.BasicServicesKit';
    3. import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit';
    4. @Entry
    5. @Component
    6. struct WebPermissionsPage {
    7. controller: webview.WebviewController = new webview.WebviewController();
    8. uiContext: UIContext = this.getUIContext();
    9. requestPermissions(arr: Array<string>) {
    10. let permissionList: Array<Permissions> = [];
    11. arr.forEach((it) => {
    12. if (it.toString() === 'TYPE_VIDEO_CAPTURE') {
    13. permissionList.push('ohos.permission.CAMERA');
    14. permissionList.push('ohos.permission.MICROPHONE');
    15. } else if (it.toString() === 'TYPE_AUDIO_CAPTURE') {
    16. permissionList.push('ohos.permission.MICROPHONE');
    17. }
    18. });
    19. let atManager = abilityAccessCtrl.createAtManager();
    20. atManager.requestPermissionsFromUser(this.getUIContext().getHostContext() as Context, permissionList)
    21. .then((data) => {
    22. console.info('data permissions:' + data.permissions);
    23. console.info('data authResults:' + data.authResults);
    24. }).catch((error: BusinessError) => {
    25. console.error(`Failed to request permissions from user. Code is ${error.code}, message is ${error.message}`);
    26. });
    27. }
    28. build() {
    29. Column() {
    30. Web({ src: $rawfile('webPermissions.html'), controller: this.controller })
    31. .fileAccess(false)
    32. .geolocationAccess(false)
    33. .metaViewport(true)
    34. .onPermissionRequest((event) => {
    35. if (event) {
    36. this.requestPermissions(event.request.getAccessibleResource());
    37. this.uiContext.showAlertDialog({
    38. title: 'title',
    39. message: 'text',
    40. primaryButton: {
    41. value: 'deny',
    42. action: () => {
    43. event.request.deny();
    44. }
    45. },
    46. secondaryButton: {
    47. value: 'onConfirm',
    48. action: () => {
    49. event.request.grant(event.request.getAccessibleResource());
    50. }
    51. },
    52. cancel: () => {
    53. event.request.deny();
    54. }
    55. });
    56. }
    57. });
    58. };
    59. }
    60. }
  3. webPermissions.html示例代码如下:
    收起
    自动换行
    深色代码主题
    复制
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    6. </head>
    7. <body>
    8. <video id="video" autoplay="autoplay"></video>
    9. <canvas id="canvas"></canvas>
    10. <br>
    11. <input type="button" title="HTML5摄像头" style="width: 200px; height: 40px;" value="开启摄像头" onclick="getMedia()"/>
    12. <script>
    13. function getMedia() {
    14. let constraints = {
    15. video: {width: 500, height: 500},
    16. audio: true
    17. };
    18. // 获取video摄像头区域
    19. let video = document.getElementById("video");
    20. // 返回的Promise对象
    21. let promise = navigator.mediaDevices.getUserMedia(constraints);
    22. // then()异步,调用MediaStream对象作为参数
    23. promise.then(function (MediaStream) {
    24. video.srcObject = MediaStream;
    25. video.play();
    26. });
    27. }
    28. function test(text) {
    29. let output = document.getElementById("container");
    30. output.innerText = text;
    31. return 'html_' + text;
    32. }
    33. </script>
    34. <div>
    35. <span>message: </span> <span id="container"></span>
    36. </div>
    37. </body>
    38. </html>

常见FAQ

Q:通过event.request.getAccessibleResource获取网页所请求的权限类型有(TYPE_MIDI_SYSEX、TYPE_VIDEO_CAPTURE 、TYPE_AUDIO_CAPTURE、TYPE_SENSOR)四种,如何通过这四种枚举判断是请求了什么权限?

A:ProtectedResourceType枚举有4种类型:

  1. TYPE_MIDI_SYSEX目前还不支持申请使用midi设备相关的权限;
  2. TYPE_VIDEO_CAPTURE是视频捕获资源,可申请ohos.permission.CAMERA相机权限;
  3. TYPE_AUDIO_CAPTURE是音频捕获资源,可申请ohos.permission.MICROPHONE麦克风权限;
  4. TYPE_SENSOR是传感器资源,可申请ohos.permission.ACCELEROMETER加速度传感器和ohos.permission.GYROSCOPE陀螺仪传感器。

具体使用详情可以参考文档:onPermissionRequest使用运动和方向传感器监测设备状态

在 FAQ 中进行搜索
请输入您想要搜索的关键词