📜  初始拒绝后使用 getUserMedia() 重新提示权限 (1)

📅  最后修改于: 2023-12-03 14:50:16.827000             🧑  作者: Mango

通过 getUserMedia() 重新提示权限

在Web开发中,使用摄像头或麦克风时,需要获取用户的设备权限。如果用户在第一次弹窗提示中选择了拒绝,程序应该如何处理呢?这时候就需要使用 getUserMedia() 方法重新提示权限。

getUserMedia() 方法

getUserMedia() 是 Web 实时通信(WebRTC)标准的一部分,它使 Web 应用程序能够访问用户媒体设备,如摄像头或麦克风。它使用 Promise 返回一个 MediaStream 对象,该对象包含有关媒体流的信息,例如播放和暂停。

使用该方法可以轻松地获取用户的媒体设备并进行视频和音频通信。

navigator.mediaDevices.getUserMedia(constraints)
  .then(function(stream) {
    /* 对MediaStream进行操作 */
  })
  .catch(function(err) {
    /* 处理error */
  });
初始拒绝后重新提示权限

如果用户在第一次弹窗提示中选择了拒绝,我们可以在用户操作后重新提示权限。但是要注意的是,getUserMedia() 方法调用后不会再次触发浏览器的权限请求,我们需要使用 MediaStreamTrack.getSettings() 方法来重新获取权限。

我们需要使用以下步骤来重新获取设备权限:

  1. 使用 getUserMedia() 方法获取媒体流。

  2. 如果 getUserMedia() 返回的 Promise 被拒绝,则使用 MediaStreamTrack.getSettings() 方法来获取状态对象。

  3. 如果状态对象的状态为“拒绝”,则需要重新提示权限。

下面是一个代码示例:

let constraints = {
  audio: true,
  video: true
};

navigator.mediaDevices.getUserMedia(constraints)
  .then(function(stream) {
    /* 对MediaStream进行操作 */
  })
  .catch(function(err) {
    console.log(err.name + ": " + err.message);

    if(err.name === "PermissionDeniedError") {
      let tracks = stream.getTracks();

      if(tracks.length > 0) {
        tracks[0].stop();
      }

      let settings = tracks[0].getSettings();
      if(settings.deviceId === '' || settings.deviceId === null) {
        // 用户仍在拒绝
      } else {
        // 用户已经选择允许,但错误仍在持续
      }
    }
  });

在以上代码中,我们首先使用 getUserMedia() 获取媒体流。如果 Promise 被拒绝,我们检查拒绝的错误类型。如果类型为 PermissionDeniedError,我们停止所有的媒体流轨道,然后使用 MediaStreamTrack.getSettings() 方法获取状态对象。

如果状态对象的状态为“拒绝”,则需要重新提示权限。如果状态对象的状态不是“拒绝”,则说明用户已经选择允许,但错误仍在持续。在这种情况下,我们需要提示用户解决错误。