gpt4 book ai didi

java - Android WebView 播放 HTML5/h.264/mp​​4 视频,如何进入 MediaPlayer

转载 作者:IT老高 更新时间:2023-10-28 21:02:30 25 4
gpt4 key购买 nike

我有一个 Activity这是 WebView .我有一个 WebChromeClient在里面。在其中,有几个回调旨在返回 MediaPlayer处理视频位。例如:

@Override
public void onPrepared(MediaPlayer mp) {
Log.i(TAG, " -------------> onPrepared");
}

当我将 MP4 流加载到 WebView 时,这些无法触发使用 HTML <video>标签(通过注入(inject))。

当我finish() Activity ,logcat 报告:

09-13 23:55:24.590: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:24.680: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:24.680: E/MediaPlayer(7949): mOnVideoSizeChangedListener is null. Failed to send MEDIA_SET_VIDEO_SIZE message.
09-13 23:55:25.675: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:26.735: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:27.755: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:28.705: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.

尽我所能,我无法让它停止,即使 WebView被清除,然后被销毁。使用 <video> 加载视频时标签,我不知道有什么方法可以强制 WebChromeClient使用特定的 MediaPlayer我为它创造的。似乎决心使用一些隐藏的,它报告了上述内容。有没有办法找到MediaPlayer通过 <video> 创建标记 WebView ?

--更新

这里是初始化WebView的代码:

        mWebView = new WebView(mContext);

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setPluginState(PluginState.OFF);
mWebView.setVisibility(View.INVISIBLE);
mWebView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);
mWebView.getSettings().setBuiltInZoomControls(false);
mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.clearHistory();
mWebView.clearFormData();
mWebView.clearCache(true);
mWebView.getSettings().setAllowFileAccess(true);
mWebView.getSettings().setUserAgentString("Android Mozilla/5.0 AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30");

chrome = new MyWebChromeClient();
mWebView.setWebChromeClient(chrome);

wvc = new MyWebViewClient();
mWebView.setWebViewClient(wvc);

mDomain = "http://foo.bar.com";
mWebView.requestFocus(View.FOCUS_DOWN);

String meat = genMainHTML(R.raw.frame);

mWebView.loadDataWithBaseURL(mDomain, meat, "text/html", "utf-8", null);

“帧”代码是一个 iframe,用于启动一些视频(至少 Vimeo 和 YouTube 似乎都采用这种方法)。我对它进行了一些修剪以避免杂乱无章:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div>
<iframe src="-target.url.with.params-" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen>
</iframe>
</div>
</body>
</html>

在那个 WebView 类中,存在这个类:

private class MyWebViewClient extends WebViewClient {

@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
String injection = injectPageMonitor();
if(injection != null && !injectionComplete) {
// Log.i(TAG, " ---------------> Page Loaded . . .");
view.loadUrl(injection);
injectionComplete = true;
}
}

@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Log.d(TAG, "*** Error ["+description+"] ["+failingUrl+"]");
Toast.makeText(mContext, description, Toast.LENGTH_SHORT).show();
}

}

还有这个类:

    private class MyWebChromeClient extends WebChromeClient implements MediaPlayer.OnInfoListener, MediaPlayer.OnSeekCompleteListener, MediaPlayer.OnErrorListener, MediaPlayer.OnVideoSizeChangedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnBufferingUpdateListener {

@Override
public void onProgressChanged(WebView view, int progress) {
//Log.e(TAG, " -------------> Progress Changed . . . . ["+progress+"] mWebView ["+mWebView+"] ["+view+"]");
if(progress == 100) {
// Do something really interesting
} else {
updateBuffering(UPDATE_PERCENT_LAUNCH_EXTRACTOR + (progress / 2));
}
}

@Override
public boolean onConsoleMessage(ConsoleMessage cm) {
// Spit out lots of console messages here
return(true);
}
}

我已经覆盖了所有常见的嫌疑人,以防万一我幸运并从 MediaPlayer 得到一些响应:

        @Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// Jump up and down because we got a mp!
// never happens, so no jumping
}

作为旁注,我确实使用反射进行了挖掘,并通过这种方式获得了 MediaPlayer,但在做那种事情之后我总是觉得有点古怪。即使我有 MediaPlayer 对象,我也不愿意发布它。稍微研究一下 MP 的源代码表明不会发生任何不好的事情,但是 . . .

这并不是在每台设备上都会发生的,我注意到了。例如,HTC 的表现似乎比三星好(“相同的”操作系统/API 级别——我没有足够的野心来比较两个源代码树)。

下面提到的行为很烦人,但仅限于我(正在观看 logcat 输出的人。对于用户或应用程序来说,它似乎没有效果。只是我真的不喜欢我正在启动 MediaPlayer 的想法例如,将其设置为忙于缓存,然后(如果/当用户终止我的应用程序时)将那个丁香莓卡在那里。此时我有很多钱用于治疗,这似乎没有帮助.

提前致谢。

最佳答案

没有反射就无法访问 MediaPlayer - WebViewClient 和 WebChromeClient 不会故意公开它。你说得对,使用反射可能会导致你的应用程序或 WebView 崩溃,因为代码可能因 Android 版本而异,甚至因 OEM 而异。

如果您想这样做,您必须找到与您的视频元素对应的 HTML5VideoView 实例。此对象创建并维护 MediaPlayer 的一个实例作为“mPlayer”。请看 https://github.com/android/platform_frameworks_base/blob/jb-mr2-release/core/java/android/webkit/HTML5VideoView.java .

关于java - Android WebView 播放 HTML5/h.264/mp​​4 视频,如何进入 MediaPlayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12418014/

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