reactjs Zoom SDK的“ZoomVideo.getDevices()”获取“DOMException:权限被拒绝”尽管允许Android浏览器中的相机

t1rydlwq  于 2023-06-22  发布在  React
关注(0)|答案(2)|浏览(139)

我正在调试为什么在Android的Chrome浏览器上运行时没有设备列出:
ZoomVideo.getDevices()
一旦它点击了那行代码,我的手机将请求使用我的相机的权限,我按下允许权限,然后我在控制台中看到错误:
DOMException:拒绝许可
有人知道发生什么事了吗这是一个使用Zoom API的React前端应用程序

zxlwwiss

zxlwwiss1#

打开一个赏金后找到了答案
在Android麦克风权限中,“每次问”是不够的;你必须有它在“允许仅在使用应用程序”

yzuktlbb

yzuktlbb2#

虽然你自己找到了答案,但你要求一个规范的答案。所以我允许自己详细阐述一下你的问题和解决方案的背景,正如你想知道的那样,发生了什么。;-)
人们可以使用这些链接作为进一步详细研究的起点。

用例-摄像头、麦克风和位置

令人惊讶的是,权限Allow only while using the app--实际上是整个主题--在开放源代码中并没有得到很好的阐述。让我们从应用此权限的两种情况开始。Techwise指南“如何允许Chrome访问Android上的相机和麦克风”提到了这一步骤
1.点击相机选项并选择Allow only while using the app
此外,我们还将在Android开发者文档中的“在运行时请求位置访问”中找到类似的情况。
图1.需要前台位置访问的位置共享功能。如果用户选择Allow only while using the app,则启用该功能。
这不是巧合,我们将在相机/麦克风或位置的上下文中找到Allow only while using the app(从现在开始,让我们将它们缩写为CML)。Google支持页面“更改Android手机上的应用权限”列出
要更改权限设置,请点击权限设置,然后选择AllowDon't allow
对于位置、摄像头和麦克风权限,您可以选择:

  • All the time:仅用于位置。该应用可以随时使用该权限,即使您不使用该应用时也是如此。
  • Allow only while using the app:应用程序只能在您使用该应用程序时使用该权限。
  • Ask every time:每次打开应用程序时,它都会询问使用权限。它可以使用该权限,直到你完成应用程序。
  • Don't allow:应用无法使用该权限,即使您正在使用该应用也是如此。

感性要求严谨

在此之前,您也会发现CML只有AllowDon't Allow,以及Ask every timeAsk firstAsk to allow或类似的东西。要么是事先决定是否允许,要么是每次启动应用程序时决定是否允许。到目前为止很容易。
然而,很明显CML是明智的,并且在Android 10(API级别29)中,CML的使用变得更加严格,特别是在一点上--前台和后台服务也有所不同。正如我们在文档中看到的那样,“请求位置权限:背景位置”
在Android 10(API级别29)及更高版本上,您必须在应用清单中声明ACCESS_BACKGROUND_LOCATION权限,才能在运行时请求后台位置访问。在早期版本的Android上,当您的应用接收前台位置访问时,它也会自动接收后台位置访问。
可以在这里标记“更早”,并记住上面提到的“更早”。这是有联系的还要注意关键字“runtime”。正如文档中所说的“运行时权限”:
运行时权限(也称为危险权限)给予您的应用访问受限数据的额外权限,或允许您的应用执行受限操作,这些操作会对系统和其他应用产生更大影响。
因此,用户必须显式地授予此类权限。开发商应
不要假设这些权限以前已经被授予--检查它们,如果需要,在每次访问之前请求它们。
这导致了众所周知的访问存储、联系人、CML或其他任何合理的权限提示--尽管CML被认为是特别合理的。因此,CML的权限列表包含如下层次结构:

  • Don't allow:名词就是预兆。
  • Ask every time:仅反映用户使用服务的 * 基本 * 权限,在安装时预先提供。当需要更严格的权限时,比如CML,这是不够的,因为这个选项在前台和后台访问之间没有区别。
  • Allow only while using the app:* 显式 * 仅在使用应用程序时在 * 前台 * 赠款对相关服务的访问权限。
  • All the time:仅用于位置。明确地允许位置服务不仅在前台运行,而且在后台运行。

因此,尽管Ask every time可以用于授权访问,例如:对于存储器或联系人,在应用范例的情况下,必须在许可方面分开考虑前台或后台中的服务的使用是不够的。也许在未来,这种范式将不仅仅适用于CML。

**注:“单独”一词可能会产生误导。最后你有三个选择

  • 不许
  • 允许前台
  • 允许前景 * 和背景 *

如果没有前台的权限,就没有选项来获取后台的权限。

总结

Ask every time在你的情况下还不够,因为它对于Android 10以来的相机服务来说不够严格。因此,您必须授予更严格的权限Allow only while using the app

相关问题