复现步骤
App拒绝摄像头麦克风权限之后,打开h5页面,调用getUserMedia方法,系统弹出授权提示框,点击同意,此时无法调起摄像头,代码抛出NotAllowedError错误。然后再次调用getUserMedia方法,系统无法弹出授权框,而且getUserMedia方法也没有响应。
const navigatorGetUserMedia = async (constrains) => {
if (navigator.mediaDevices.getUserMedia) {
return navigator.mediaDevices.getUserMedia(constrains);
} else if (navigator.webkitGetUserMedia) {
return navigator.webkitGetUserMedia(constrains);
} else if (navigator.mozGetUserMedia) {
return navagator.mozGetUserMedia(constrains);
} else if (navigator.getUserMedia) {
return navigator.getUserMedia(constrains);
}
}
// 二次调用navigatorGetUserMedia, 会一直处于pending状态
const stream = await navigatorGetUserMedia({
video: true,
audio: true
});
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
针对您遇到的问题,即App在用户首次拒绝摄像头和麦克风权限后,再次尝试调用getUserMedia
方法时无法正常弹出授权提示且抛出错误的情况,可以参考以下解决方案:
权限管理:
AndroidManifest.xml
中已经声明了相关权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
onRequestPermissionsResult
方法以处理权限请求的结果,并根据结果采取相应行动。自定义权限请求处理:
WebChromeClient
的onPermissionRequest
方法,确保在用户同意时正确授予所有请求的权限。Info.plist配置:
Info.plist
文件中已添加了相机和麦克风的使用描述:
<key>NSCameraUsageDescription</key>
<string>需要访问您的摄像头以进行视频通话</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要访问您的麦克风以进行语音通话</string>
权限检查与引导:
getUserMedia
之前,主动检查麦克风权限状态。如果权限被拒绝,可以通过代码引导用户至系统设置页面开启权限,如Harmony SDK示例中的做法所示,尽管这是Harmony OS的示例,但思路类似,即通过系统API检查权限并引导用户操作。处理连续调用问题:
navigatorGetUserMedia
可能会导致Promise处于pending状态。考虑在每次调用前检查是否已有挂起的权限请求或媒体流获取操作,并适当处理这些情况,避免并发冲突。getUserMedia
的兼容调用方式,但在解决权限问题上,重点应放在原生应用层面对权限的管理和处理上。getUserMedia
前,利用原生桥接(如React Native、Cordova等框架提供的功能)检查并请求权限,确保权限已被正确授予后再执行媒体设备访问操作。通过上述措施,您可以改善当前应用在处理摄像头和麦克风权限问题上的体验,确保在用户同意权限后能成功调用getUserMedia
方法。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。