HarmonyOS鸿蒙Next中Navigator.mediaDevices.getUserMedia请求摄像头及录音权限无效

HarmonyOS鸿蒙Next中Navigator.mediaDevices.getUserMedia请求摄像头及录音权限无效 Navigator. mediaDevices. getUserMedia方法无法请求到鸿蒙HarmonyOS NEXT系统手机摄像头及录音权限,请问有什么好的方法可以调用到HarmonyOS NEXT系统权限呢?在线等,挺着急的。。。。

9 回复

楼主可以参考下面步骤

  1. 在module.json5文件配置’ohos.permission.MICROPHONE’话筒权限。
{
  "module" : {
    // ...
    "requestPermissions":[
      {
        "name" : "ohos.permission.MICROPHONE",
        "reason": "$string:reason",
        "usedScene": {
          "abilities": [
            "FormAbility"
          ],
          "when":"inuse"
        }
      },
    ]
  }
}
  1. Web组件通过onPermissionRequest方法获取话筒权限请求。代码示例如下:
// xxx.ets
import { webview } from '@kit.ArkWeb';
import { BusinessError } from '@kit.BasicServicesKit';
import { abilityAccessCtrl } from '@kit.AbilityKit';

@Entry
@Component
struct WebComponent {
  controller: webview.WebviewController = new webview.WebviewController();

  aboutToAppear() {
    let atManager = abilityAccessCtrl.createAtManager();
    // 通过onPermissionRequest获取权限请求
    atManager.requestPermissionsFromUser(this.getUIContext().getHostContext(), ['ohos.permission.MICROPHONE'])
      .then((data) => {
        console.info(`data: ${JSON.stringify(data)}`);
        console.info(`data permissions: ${data.permissions}`);
        console.info(`data authResults: ${data.authResults}`);

      }).catch((error: BusinessError) => {
      console.error(`Failed to request permissions from user. Code is ${error.code}, message is ${error.message}`);
    })
  }

  build() {
    Column() {
      Web({ src: $rawfile('index.html'), controller: this.controller })
        .javaScriptAccess(true)
        .fileAccess(true)
        .domStorageAccess(true)
        .onPermissionRequest((event) => {
          if (event) {
            this.getUIContext().showAlertDialog({
              title: '麦克风权限请求',
              message: '是否允许获取麦克风权限',
              primaryButton: {
                value: 'deny',
                action: () => {
                  event.request.deny();
                }
              },
              secondaryButton: {
                value: 'onConfirm',
                action: () => {
                  event.request.grant(event.request.getAccessibleResource());
                }
              },
              cancel: () => {
                event.request.deny();
              }
            })
          }
        })
    }
  }
}

更多关于HarmonyOS鸿蒙Next中Navigator.mediaDevices.getUserMedia请求摄像头及录音权限无效的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


看看这个:在Web中打开摄像头和麦克风

应用侧代码:

import { webview } from '@kit.ArkWeb';
import { BusinessError } from '@kit.BasicServicesKit';
import { abilityAccessCtrl } from '@kit.AbilityKit';

@Entry
@Component
struct WebComponent {
  controller: webview.WebviewController = new webview.WebviewController();
  uiContext: UIContext = this.getUIContext();

  aboutToAppear() {
    // 配置Web开启调试模式
    webview.WebviewController.setWebDebuggingAccess(true);
    // 获取权限请求通知,点击onConfirm按钮后,拉起摄像头和麦克风。
    let atManager = abilityAccessCtrl.createAtManager();
    atManager.requestPermissionsFromUser(this.uiContext.getHostContext(), ['ohos.permission.CAMERA', 'ohos.permission.MICROPHONE'])
      .then((data) => {
        console.info('data:' + JSON.stringify(data));
        console.info('data permissions:' + data.permissions);
        console.info('data authResults:' + data.authResults);
      }).catch((error: BusinessError) => {
      console.error(`Failed to request permissions from user. Code is ${error.code}, message is ${error.message}`);
    })
  }

  build() {
    Column() {
      Web({ src: $rawfile('index.html'), controller: this.controller })
        .onPermissionRequest((event) => {
          if (event) {
            this.uiContext.showAlertDialog({
              title: 'title',
              message: 'text',
              primaryButton: {
                value: 'deny',
                action: () => {
                  event.request.deny();
                }
              },
              secondaryButton: {
                value: 'onConfirm',
                action: () => {
                  event.request.grant(event.request.getAccessibleResource());
                }
              },
              cancel: () => {
                event.request.deny();
              }
            })
          }
        })
    }
  }
}

前端页面index.html代码:

<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
<video id="video" width="500px" height="500px" autoplay></video>
<canvas id="canvas" width="500px" height="500px"></canvas>
<br>
<input type="button" title="HTML5摄像头" value="开启摄像头" onclick="getMedia()"/>
<script>
  function getMedia()
  {
    let constraints = {
      video: {width: 500, height: 500},
      audio: true
    };
    // 获取video摄像头区域
    let video = document.getElementById("video");
    // 返回的Promise对象
    let promise = navigator.mediaDevices.getUserMedia(constraints);
    // then()异步,调用MediaStream对象作为参数
    promise.then(function(MediaStream) {
      video.srcObject = MediaStream;
      video.play();
    }).catch(function(err) {
        console.info(err.name + ": " + err.message);
    });
  }
</script>
</body>
</html>

1、如果是在浏览器里面使用 navigator.mediaDevices.getUserMedia,没有出现权限弹窗。那么请确保使用的是https域名。本地调试,可使用mkcert,解决本地https问题。

示例代码:

<!-- index.html -->

<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
    </head>

    <body>
        <div>
            <input type="button" title="HTML5摄像头" value="开启摄像头" onclick="getMedia()" />
        </div>

        <div>
            <video id="video" width="400px" height="400px" autoplay="autoplay"></video>
        </div>

        <script>
            async function getMedia() {
                const video = document.getElementById('video')

                const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true })

                video.srcObject = stream

                await video.play()
            }
        </script>
    </body>
</html>

cke_1969.png

2、如果是App内web的h5使用navigator.mediaDevices.getUserMedia,是需要在web和应用内申请权限的。参考配置

module.json5 -> requestPermissions

   "requestPermissions": [
      {
        "name": "ohos.permission.MICROPHONE",
        "reason": "$string:microphone_permission",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "inuse"
        }
      },
      {
        "name": "ohos.permission.CAMERA",
        "reason": "$string:camera_permission",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "inuse"
        }
      }
   ]

web 收到获取权限请求:

Web()
.onPermissionRequest((event) => {
        if (event) {
          const list = event.request.getAccessibleResource()
          const permissions = list.map(e => {
            if (e === ProtectedResourceType.AUDIO_CAPTURE) {
              return 'ohos.permission.MICROPHONE'
            }
            return 'ohos.permission.CAMERA'
          })

          this.requestPermission(permissions, (granted: boolean) => {
            if (granted) {
              event.request.grant(list);
            } else {
              event.request.deny()
              let text = '无法使用麦克风,请前往设置打开权限'
              if (list.includes(ProtectedResourceType.VIDEO_CAPTURE)) {
                text = '无法使用相机拍摄,请前往设置打开权限'
              }
              this.denyAlert(text)
            }
          })
        }
      })

楼主参考下这篇帖子webview嵌入的页面需要页面的麦克风权限试试呢,主要思路是先在ArkTS中通过requestPermissionsFromUser获取用户授权后,再通过ArkWeb的onPermissionRequest接口进行处理

好的,感谢,我看下,

您好,请问下,我这边使用的是原生的 H5 应用,无法引入’@kit.ArkWeb’、’@kit.BasicServicesKit’、’@kit.AbilityKit’,这几个依赖包,还有其它的方法吗?

@kit.ArkWeb@kit.BasicServicesKit@kit.AbilityKit这几个依赖包是在ArkTS文件中引入的,比如@kit.ArkWeb是用来引入Web组件作为加载H5页面的容器的,你正常新建一个ets工程,引入这些包后,再用Web容器加载你开发的H5应用,

在HarmonyOS Next中,Navigator.mediaDevices.getUserMedia 接口请求摄像头和录音权限时,若权限申请无效,通常与权限配置或API调用方式有关。

首先,确保在module.json5配置文件中正确声明了ohos.permission.CAMERA和ohos.permission.MICROPHONE权限,并配置了对应的权限使用场景(abilities或stage)。

其次,在调用getUserMedia前,必须使用系统提供的权限申请API(如requestPermissionsFromUser)动态申请权限。仅配置静态权限声明不足以触发系统弹窗。

此外,需确认调用时机符合系统要求,例如在应用启动或页面可见时申请。权限申请结果需在对应的回调函数中处理。

在HarmonyOS Next中,Navigator.mediaDevices.getUserMedia 属于Web API,其权限调用依赖于系统WebView的底层实现。如果此方法无效,通常是因为系统对Web端的媒体设备访问权限管理更为严格,或者该API在当前的HarmonyOS Next版本中尚未得到完整支持。

建议直接使用HarmonyOS Next的原生权限申请与媒体采集能力,这是最稳定可靠的方式:

  1. 申请权限:在module.json5文件中声明所需权限,例如:

    "requestPermissions": [
      {
        "name": "ohos.permission.CAMERA"
      },
      {
        "name": "ohos.permission.MICROPHONE"
      }
    ]
    

    运行时通过abilityAccessCtrl相关API动态申请权限。

  2. 使用媒体采集API:通过@ohos.multimedia.camera@ohos.multimedia.audio等系统原生接口直接调用摄像头和麦克风,例如使用cameraManager类进行拍照、录像,或使用audioCapturer进行录音。

这种方式能确保与HarmonyOS Next的权限管理系统完全兼容,避免Web API的兼容性问题。如果应用本身是Web应用,需考虑通过ArkWeb等桥接机制与原生层交互,或推动HarmonyOS Next后续版本对Web API的进一步支持。

回到顶部