返回

Android 12+ WebView 中 WebRTC 麦克风暂停问题及解决方法:快速修复指南

Android

Android 12+ WebView 中 WebRTC 麦克风暂停问题及其解决方案

引言

在使用 WebRTC 进行实时语音通话的 Android 应用中,当屏幕锁定或切换到其他应用时,WebView 中的麦克风可能会停止工作。这个问题困扰着许多开发者,妨碍了 WebRTC 应用的正常使用。

问题

问题源于 Android 12 中引入的隐私保护措施,旨在防止应用在后台访问麦克风。当 WebView 被暂停时,Android 系统将自动禁用麦克风权限,导致 WebRTC 麦克风停止工作。

解决方法

为了解决这一问题,需要采用一种方法,可以在 WebView 暂停时仍然保持麦克风处于活动状态。以下是一种有效且可行的解决方法:

自定义 WebViewClient

  1. 创建一个自定义的 WebViewClient,并覆盖 onPageCommitVisible 方法。
  2. onPageCommitVisible 方法中,检查麦克风权限,并在已授予权限的情况下,使用 JavaScript 启用麦克风。

设置自定义 WebViewClient

在包含 WebView 的活动中,将自定义 WebViewClient 设置为 WebView 的 WebViewClient。

请求麦克风权限

当用户授予麦克风权限时,WebViewClient 会自动启用麦克风。

注意事项

  • 在 AndroidManifest.xml 中声明 RECORD_AUDIO 权限。
  • 确保 WebView 支持 JavaScript。
  • 为了防止麦克风在 WebView 销毁后继续录制,需要在 onPageFinished 方法中禁用麦克风。

代码示例

class CustomWebViewClient : WebViewClient() {
    override fun onPageCommitVisible(view: WebView, url: String) {
        super.onPageCommitVisible(view, url)
        enableMicrophone(view)
    }

    private fun enableMicrophone(view: WebView) {
        // 检查麦克风权限
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.RECORD_AUDIO), PERMISSION_REQUEST_CODE)
            return
        }

        // 启用麦克风
        view.evaluateJavascript("navigator.mediaDevices.getUserMedia({audio: true}).catch(e => console.error(e));", null)
    }

    override fun onPageFinished(view: WebView, url: String) {
        super.onPageFinished(view, url)
        disableMicrophone(view)
    }

    private fun disableMicrophone(view: WebView) {
        view.evaluateJavascript("navigator.mediaDevices.getUserMedia({audio: false});", null)
    }
}

结论

通过采用上述解决方法,可以在 Android 12+ 设备上有效地解决 WebRTC 麦克风暂停问题。这为 WebRTC 应用的开发者提供了宝贵的解决方案,使他们能够在遵守隐私保护措施的同时,提供无缝的语音通话体验。

常见问题解答

  1. 为什么 WebRTC 在 Android 12+ 上的 WebView 中会停止工作?
    答:这是由于 Android 12 引入了隐私保护措施,旨在防止应用在后台访问麦克风。

  2. 这种解决方法是否适用于所有版本的 Android?
    答:该解决方法专门针对 Android 12+ 设备,因为它适用于 WebView 中麦克风暂停问题。

  3. 需要授予哪些权限才能使用此解决方案?
    答:需要授予 RECORD_AUDIO 权限。

  4. 在 WebView 被销毁后,如何禁用麦克风?
    答:在 onPageFinished 方法中调用 disableMicrophone 方法。

  5. 是否可以在其他类型的 Android 应用中使用此解决方案?
    答:该解决方案专门针对 WebView 中的 WebRTC 麦克风暂停问题,因此可能不适用于其他类型的 Android 应用。