gpt4 book ai didi

javascript - Android webview视频没有达到readyState=4

转载 作者:行者123 更新时间:2023-11-30 00:55:06 24 4
gpt4 key购买 nike

我正在 Android Webview 中自动播放视频。这给互联网连接速度慢带来了问题。我收到 ANR 弹出窗口(应用程序未响应)

我认为这是因为视频在加载数据之前收到了 video.play()。 5 秒后出现 ANR 弹出窗口。

我想解决这个问题的方法是等待视频完全加载,然后再调用 video.play()

问题是 Webview 中的视频没有接收到 video.readystate == 4。即使在正常的互联网连接下,它也永远不会达到 readystate 2。在我的 Chrome 浏览器中,它确实接收到就绪状态 4。那么这是为什么呢?为什么 Webview 中的视频没有收到 readystate 4?

在我的代码下面:

<!DOCTYPE html>
<html>
<head>
<title>Video</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
</head>
<body>
<div id="item" class="item">
<video preload="auto" autobuffer width="1024" height="576" id="video">
<source id="videomp4" src="http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4" type='video/mp4' />
</video>
<script>
var interval;
$(document).ready(function () {
interval = setInterval('playVideoWhenReady()', 1000);
/*
// this doesn't work either
video.addEventListener('loadeddata', function() {
// Video is loaded and can be played
console.log("video play is triggered");
video.play();
}, false);
*/
});

function playVideoWhenReady() {
var video = document.getElementById('video');
console.log("!!!!! curstate: " + video.readyState);
if ( video.readyState == 4 ) { // this is never true in Android Webview
video.play();
clearInterval(interval);
}
}
</script>
</div>
</body>
</html>

主要 Activity :

package net.eyefinder.www.testvideo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

WebView webView = (WebView) findViewById(R.id.activity_main_webview);

final WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setMediaPlaybackRequiresUserGesture(false);
settings.setUseWideViewPort(true);

webView.setWebChromeClient(new WebChromeClient());

webView.loadUrl("file:///android_asset/video.html");
}
}

这是 list 文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.eyefinder.www.testvideo">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:hardwareAccelerated="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

<uses-permission android:name="android.permission.INTERNET" />

</manifest>

那么日志输出为:

10-31 10:55:37.369 2181-2195/net.myapp.www.testvideo D/MediaPlayerPrivateAndroid: load url=http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4
10-31 10:55:37.389 2181-2181/net.myapp.www.testvideo D/TilesManager: Starting TG #0, 0x67360d10
10-31 10:55:37.399 2181-2181/net.myapp.www.testvideo D/TilesManager: new EGLContext from framework: 63c6cd40
10-31 10:55:37.399 2181-2181/net.myapp.www.testvideo D/GLWebViewState: Reinit shader
10-31 10:55:37.429 2181-2181/net.myapp.www.testvideo D/GLWebViewState: Reinit transferQueue
10-31 10:55:37.449 2181-2181/net.myapp.www.testvideo D/VideoLayerManager: Reinit GLResource for VideoLayer
10-31 10:55:38.439 2181-2181/net.myapp.www.testvideo I/Web Console: !!!!! curstate: 2 at ../video.html:23
10-31 10:55:39.379 2181-2181/net.myapp.www.testvideo I/Web Console: !!!!! curstate: 2 at ../video.html:23
10-31 10:55:40.379 2181-2181/net.myapp.www.testvideo I/Web Console: !!!!! curstate: 2 at ../video.html:23

它一直卡在 curstate 2

最佳答案

它使用以下配置为我工作:

WebView webView = (WebView) findViewById(R.id.webview);

final WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setMediaPlaybackRequiresUserGesture(false);

webView.setWebChromeClient(new WebChromeClient());

webView.loadUrl("file:///android_asset/video.html");

src/main/assets/video.html 中:

<!DOCTYPE html>
<html>

<head>
<title>Video</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>

<body>
<video preload="auto" autoplay="autoplay" autobuffer width="1024" height="576" id="video" />
<script>
var video = document.getElementById('video');
video.src = 'http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4';
video.load();

video.addEventListener('loadeddata', function() {
video.play();
}, false);
</script>
</body>

</html>

并在 list 中获得 Internet 许可:

<uses-permission android:name="android.permission.INTERNET" />

关于javascript - Android webview视频没有达到readyState=4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40320661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com