Android 11 webview webrtc无法使用问题

问题:Android 11 webview 调用webrtc无法使用, 看logcat日志会报如下错误

[ERROR:address_tracker_linux.cc(245)] Could not send NETLINK request: Permission denied (13)

查了下相关的网络权限都有配置了还是不行,还是报这个权限问题

原因:跟 android11 限制读网卡信息有关系, 算webview的一个兼容bug 

https://developer.android.com/about/versions/11/privacy/mac-address

解决: 

方案一: 可以修改app 的targetSdkVersion小于30 

方案二:发现第一次发起连接失败后再连接就正常了,所以在正式连接之前发起一次连接

async function connect() {
     if (getAndroidVersion() === 11) {
          await this.fixAndroid({
            iceServers,
            iceCandidatePoolSize: 1, //  这里要设置1, 不设1也连不上,不知道为什么
          })
     }
    // 发起正式连接
    // let peer = new RTCPeerConnection(turn);
    // ......

}


function getAndroidVersion() {
  // 获取设备信息
  const deviceInfo = navigator.userAgent;
  // 解析设备信息
  const androidVersion = deviceInfo.match(/Android ([\d.]+)/);
  if (androidVersion && androidVersion!.length === 2) {
    return Number(androidVersion![1])
  }
  // 返回系统版本号
  return null;
};

async fixAndroid(turn: any) {
    console.log("fixing android webrtc bug");
    return new Promise(async (resolve, reject) => {
      try {
        let peer = new RTCPeerConnection(turn);
        let offer = await peer.createOffer({
          offerToReceiveAudio: true,
          offerToReceiveVideo: true
        })
        let rtcDesc = new RTCSessionDescription(offer);
        await peer.setLocalDescription(rtcDesc);
        setTimeout(()=> {
          peer.close()
          console.log("fixAndroid close")
          resolve()
        }, 1000)
      } catch (e) {
        resolve()
        console.error("fixAndroid", e)
      }
    })

  }


参考:

### 如何在WebView中集成和使用WebRTC #### iOS 平台上的 WebRTC 集成 从 iOS 14.3 开始,苹果为 `WKWebView` 增加了对 WebRTC 的支持[^1]。这意味着开发者可以通过内嵌的方式,在应用中利用 `WKWebView` 来实现基于 WebRTC 的功能。为了确保正常运行,需注意以下几点: - **启用 JavaScript 支持**:由于 WebRTC 功能依赖于 JavaScript 执行环境,因此需要确认 WebView 已经启用了 JavaScript。 ```java webView.getSettings().setJavaScriptEnabled(true); ``` - **配置媒体播放设置**:允许媒体自动播放而不受用户手势限制。 ```java webView.getSettings().setMediaPlaybackRequiresUserGesture(false); ``` 这些基础配置可以确保 WebRTC 中涉及的音频/视频流能够被正确初始化并呈现给用户。 --- #### Android 平台上 WebRTC 的集成 对于 Android 而言,要让 WebView 正常加载包含 WebRTC 的网页,则需要额外完成一些特定的适配工作[^2][^3]。以下是几个关键点: - **权限管理**:如果应用程序需要访问摄像头或者麦克风资源,那么必须申请相应的权限,并将其授予 WebView 使用。 ```xml <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> ``` - **调整 WebView 设置**:除了基本的脚本执行能力外,还需要开放文件读取以及其他可能影响性能表现的相关选项。 ```java WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); // 启用 JS settings.setAllowContentAccess(true); // 允许 Content URL 访问 settings.setAllowFileAccess(true); // 文件系统访问许可 settings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 不缓存模式 ``` 另外需要注意的是,当涉及到调用设备硬件接口 (比如相机或麦克风) 时,通常会遇到跨域问题或者是安全沙箱机制阻止操作的情况。此时就需要针对具体场景做进一步优化处理,例如通过自定义 ChromeClient 或者 WebChromeClient 类来拦截请求并提供解决方案。 --- #### 示例代码展示 下面给出一段简单的 Java 实现片段用于演示如何快速搭建一个具备 WebRTC 功能的基础框架结构: ```java import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import android.webkit.WebView; public class MainActivity extends AppCompatActivity { private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = findViewById(R.id.webview); initWebViewSettings(); String url = "https://your-webrtc-page.com"; mWebView.loadUrl(url); } private void initWebViewSettings() { WebSettings webSettings = mWebView.getSettings(); // Enable necessary features for WebRTC support. webSettings.setJavaScriptEnabled(true); webSettings.setMediaPlaybackRequiresUserGesture(false); webSettings.setAllowContentAccess(true); webSettings.setAllowFileAccess(true); webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE ); } } ``` 上述例子展示了如何创建一个具有初步 WebRTC 支持的应用界面组件实例化过程及其关联属性设定方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值