【问题标题】:MediaDevices.getUserMedia() support for iosMediaDevices.getUserMedia() 对 ios 的支持
【发布时间】:2020-08-07 13:37:38
【问题描述】:

我试图在 ReactJS 项目中获取浏览器设置详细信息(相机、麦克风权限)。基于此,如果它被阻止,我将在 UI 中显示一些错误消息。我使用以下代码。

useEffect(()=>{
collectUserLogData();
},[]);

const collectUserLogData = () => {
    navigator.getMedia =
      navigator.getUserMedia ||
      navigator.webkitGetUserMedia ||
      navigator.mozGetUserMedia ||
      navigator.msGetUserMedia;

    navigator.getMedia(
      { video: true },
      () => {
        setCamera(true);
        console.log("Permission_", "camera ON");
      },
      () => {
        console.log("Permission_", "Camera OFF");
      }
    );

    navigator.getMedia(
      { audio: true },
      () => {
        setMic(true);
        console.log("Permission_", "Mic ON");
      },
      () => {
        console.log("Permission_", "Mic OFF");
      }
    );

    navigator.geolocation.getCurrentPosition(
      () => {
        setLocation(true);
        console.log("Permission_", "Geo ON");
      },
      () => {
        console.log("Permission_", "Geo OFF");
      }
    );
  };

这适用于 windows 和 android 浏览器,但不适用于 ios 浏览器。我没有在mac ios中测试它。 ios 浏览器中未显示弹出窗口。如何解决这个问题。

【问题讨论】:

  • 帽子确实 setCamera(true);做?您是否尝试将视频元素的 srcObj 设置为验证相机是否正常工作的流?

标签: javascript reactjs webrtc mobile-safari getusermedia


【解决方案1】:

getUserMedia() 在最新版本的 iOS 上正常工作。一般11.1及以上都可以。

要解决这些问题,您需要将 iOS 设备连接到 Mac 并使用 Safari 远程调试设置。这样您就可以获得控制台和 javascript 调试器。

enumerateDevices() 如果您已经使用 getUserMedia() 请求用户使用相机和/或麦克风的权限,则可以使用。如果没有该许可, emumerateDevices() 结果会模糊或丢失。这是为了防止浏览器指纹识别。因为网络蠕变。

在 getUserMedia 实际工作的 iOS 版本中,您无需在各种命名空间中四处寻找它。 navigator.mediaDevices.getUserMedia() 就足够了。

这里的代码就像我用来枚举各种不同浏览器平台(包括)上的媒体源的代码。 iOS、Android 和各种桌面。我使用了async / await,因为它是一种处理 getUserMedia() 返回的 Promise 的简单方法。但是如果你愿意,你可以直接使用 Promise。 (请注意,我已编辑此代码以删除特定于应用程序的内容,但我尚未对其进行调试。)

async function enumerateSources() {
    if(      navigator 
          && navigator.mediaDevices 
          && typeof navigator.mediaDevices.enumerateDevices === 'function' ) {
      try {
        /* open a generic stream to get permission to see devices; 
         * Mobile Safari insists */
        const stream = await navigator.mediaDevices.getUserMedia(
                { video: true, audio: true} )
        let devices = await navigator.mediaDevices.enumerateDevices()
        const cameras = devices.filter( device => {
          return device.kind === 'videoinput'
        })
        if (cameras.length >= 1) console.log ('cameras avail')
        const mics = devices.filter( device => {
          return device.kind === 'audioinput'
        })
        if (mics.length >= 1) console.log ('mics avail')

       /* release stream */
        const tracks = stream.getTracks()
        if( tracks ) {
          for( let t = 0; t < tracks.length; t++ ) tracks[t].stop()
        }
        return ({cameras, mics})
      } catch(error) {
        /* user refused permission, or media busy, or some other problem */
        console.error(error.name, error.message)
        return {cameras:[], mics:[]})
      }
    }
    else throw ('media device stuff not available in this browser')
}

【讨论】:

    【解决方案2】:

    新 API 的工作方式类似于

    navigator.mediaDevices.getUserMedia()
    

    我建议您添加到您的支持逻辑声明中以取代所有其他旧 API。

    然后您需要使用 promise 解析的流。您可以在我们的 DOM 中拥有一个 video 元素,并将其 srcObj 属性设置为流。

    navigator.getMedia(
          { video: true },
          (stream) => {
            video.srcObj = stream;
            setCamera(true);
            console.log("Permission_", "camera ON");
          },
          () => {
            console.log("Permission_", "Camera OFF");
          }
        );
    

    【讨论】:

    • 如果我使用这种新语法,那么弹出窗口在桌面浏览器中可以正常工作,即使在授予权限后相机也无法工作
    • 是否有可能在不覆盖默认弹出窗口的情况下获取浏览器详细信息(相机、麦克风)。因为在使用这些导航器类之前它工作正常。现在它覆盖了默认弹出窗口,这会导致 ios 浏览器出现此问题。
    • “浏览器详细信息”是什么意思?设备? navigator.mediaDevices.enumerateDevices()navigator.mediaDevices.getSupportedConstraints()
    • 我需要知道摄像头或麦克风是否被遮挡
    猜你喜欢
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2014-07-29
    • 2014-09-06
    • 1970-01-01
    • 2015-01-13
    • 2018-05-18
    相关资源
    最近更新 更多