webview页面内嵌webRTC在uni-app中偶尔权限请求框不弹出请求导致rtc无法推流到蓝牙设备的问题

webview页面内嵌webRTC在uni-app中偶尔权限请求框不弹出请求导致rtc无法推流到蓝牙设备的问题

开发环境 版本号 项目创建方式
Windows Windows 11 专业版 26100.3194 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:4.57

手机系统:Android

手机系统版本号:Android 13

手机厂商:小米

手机机型:小米10S 小米11

页面类型:vue

vue版本:vue3

打包方式:云端

项目创建方式:HBuilderX

------------------------------------------index.vue-----------------------------------

---------------------------------------webview.vue---------------------------------------


```html
<template>
<view>
<web-view src="https://demo.volcvideo.com/aigc"></web-view>
</view>
</template>
<script>
import adapter from 'webrtc-adapter';
uni.getSystemInfo({
success: function (res) {
console.error('--------------23---------',res.browserName)
}
});
</script>

--------------------------------------------manifest.json--------------------------------------------------


```json
{
"name" : "rtcdemo-0330",
"appid" : "UNIA4BF360",
"description" : "",
"versionName" : "1.0.2",
"versionCode" : 103,
"transformPx" : false,
/* 5+App特有相关 */
"app-plus" : {
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"webView" : {
// 3.5.0 + 仅Android支持
"x5" : {
// 此属性需要勾选 Android X5 Webview 模块,详细参见下面的说明
"timeOut" : 3000, // 超时时间
"showTipsWithoutWifi" : true, // 是否在非WiFi网络环境时,显示用户确认下载x5内核的弹窗。默认值false
"allowDownloadWithoutWiFi" : false // 是否允许用户在非WiFi网络时进行x5内核的下载。默认值false(如果为true,就不会显示用户确认的弹窗。)
}
},
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
/* 模块配置 */
"modules" : {
"Record" : {},
"Webview-x5" : {}
},
/* 应用发布信息 */
"distribute" : {
/* android打包配置 */
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
/* ios打包配置 */
"ios" : {
"dSYMs" : false
},
/* SDK配置 */
"sdkConfigs" : {}
}
},
/* 快应用特有相关 */
"quickapp" : {},
/* 小程序特有相关 */
"mp-weixin" : {
"appid" : "",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "3"
}

操作步骤:

  1. 问题复现步骤:
    • 打开 APP,进入包含 Webview 的页面。
    • 等待页面加载完成,WebRTC 尝试获取媒体设备权限。
    • 有时会正常弹出请求选择框,提升用户是否给麦克风权限;但大多数时间不会弹出该请求框,且没有任何错误提示。

预期结果:

  • 首次进入 Webview 页面,当 WebRTC 尝试获取媒体设备权限时,都应该弹出请求选择框,让用户同意麦克风权限。

实际结果:

  • 高概率不会弹出请求选择框,导致音频是无法推送到无麦克风设备的蓝牙音响。


### bug描述:
我正在使用 Uniapp 开发一个 APP 项目,在 APP 中使用 Webview 页面内嵌 WebRTC 功能。已经勾选了x5内核并且按照论坛中的建议添加了https://webrtc.github.io/adapter/adapter-latest.js 这个整合api然而,在将 APP 打包后,还是大概率的会遇到 Webview 页面不弹出请求选择框的问题。该问题并非每次都会出现,具有一定的随机性,在小米手机上测试发现 当不出现这个请求选择框时,音频是无法推送到无麦克风设备的蓝牙音响的。这给我定位和解决问题带来了很大的困扰。

更多关于webview页面内嵌webRTC在uni-app中偶尔权限请求框不弹出请求导致rtc无法推流到蓝牙设备的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于webview页面内嵌webRTC在uni-app中偶尔权限请求框不弹出请求导致rtc无法推流到蓝牙设备的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个典型的WebRTC权限请求在Android WebView中的兼容性问题。根据你的描述,我分析可能的原因和解决方案如下:

  1. 权限请求失败可能和X5内核的兼容性有关,建议在manifest.json中增加以下配置:
"webView": {
    "x5": {
        "mediaCapturePermission": true
    }
}
  1. 在Android 13上,WebView的权限请求机制有所变化,建议在应用启动时就预先获取麦克风权限:
uni.authorize({
    scope: 'scope.record',
    success() {
        console.log('已授权录音权限')
    }
})
  1. 对于蓝牙设备的问题,需要在manifest.json中添加蓝牙权限:
"<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>"
  1. 可以尝试在WebView加载前强制请求权限:
onLoad() {
    uni.getSetting({
        success(res) {
            if(!res.authSetting['scope.record']) {
                uni.authorize({scope: 'scope.record'})
            }
        }
    })
}
回到顶部