You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android WebView使用YouTube IFrame API播放视频出现错误码153的问题求助

Android WebView使用YouTube IFrame API播放视频出现错误码153的问题求助

大家好,我现在在做Android WebView内嵌YouTube IFrame API播放视频的功能,初始化流程看起来是正常的,但偶尔会触发错误码153的报错。目前我用了跳转到移动YouTube页面的兜底方案,但这样会丢失WebView里的自定义控制逻辑,不是最优解,想请教下有没有更好的解决办法?

先给大家看下我的WebView配置和内嵌的HTML代码:

WebView初始化配置

binding?.playerWebview?.apply {
    with(settings) {
        javaScriptEnabled = true
        mediaPlaybackRequiresUserGesture = false
        domStorageEnabled = true
        allowFileAccess = true
        allowContentAccess = true
        setSupportZoom(false)
        loadWithOverviewMode = true
        useWideViewPort = true
        mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
        cacheMode = WebSettings.LOAD_DEFAULT
    }

    webChromeClient = WebChromeClient()
    webViewClient = object : WebViewClient() {
        override fun onPageFinished(view: WebView?, url: String?) {
            if (isYouTube) {
                evaluateJavascript("player.playVideo();", null)
            }
        }

        override fun onReceivedError(
            view: WebView?,
            request: WebResourceRequest?,
            error: WebResourceError?
        ) {
            super.onReceivedError(view, request, error)
            binding?.pbLoading?.isVisible = false
        }
    }

    addJavascriptInterface(VideoBridge(), "Android")

    val html = """
        <!DOCTYPE html>
        <html>
        <body>
            <div id="player"></div>
            <script src="https://www.youtube.com/iframe_api"></script>
            <script>
                var player;
                function onYouTubeIframeAPIReady() {
                    player = new YT.Player('player', {
                        videoId: '$videoSource',
                        playerVars: {
                            autoplay: 1,
                            controls: 0,
                            playsinline: 1,
                            enablejsapi: 1
                        },
                        events: {
                            onReady: function(event) {
                                event.target.playVideo();
                                Android.onPlayerReady();
                            },
                            onError: function(error) {
                                Android.onPlayerError(error.data);
                                if (error.data === 101 || error.data === 150 || error.data === 153) {
                                    // 目前的兜底方案:跳转到移动端YouTube
                                    window.location.href = "https://m.youtube.com/watch?v=$videoSource";
                                }
                            }
                        }
                    });
                }
            </script>
        </body>
        </html>
    """.trimIndent()

    loadDataWithBaseURL(null, html, "text/html", "UTF-8", null)
}

目前遇到的问题

  • 错误码153偶尔触发,根据YouTube的错误码说明,这个错误和101/150类似,应该是视频的播放权限限制(比如部分地区不可看,或者视频所有者禁止嵌入播放)
  • 现在的兜底方案是跳转到YouTube原生页面,虽然能播放,但完全脱离了我们自己的WebView控制逻辑,体验不够好
  • 试过在错误回调里重复调用playVideo()重试,但效果不稳定

想请教的问题

  1. 有没有办法在WebView内解决153错误,不用跳转到外部页面?
  2. 如果必须处理权限限制,有没有更优雅的兜底方案?比如在WebView内提示用户,而不是直接跳转?
  3. 我的WebView配置或者IFrame的playerVars参数有没有配置不当的地方,导致触发这个错误?

麻烦各位大佬帮忙看看,谢谢啦!

火山引擎 最新活动