我正在尝试在 SurfaceTexture 上绘制 WebView,以便可以在 OpenGL 中呈现它。到目前为止,我已成功地以标准方式在 WebView 中播放了 YouTube 视频。
...
webView.getSettings().setJavaScriptEnabled(true);
if (Build.VERSION.SDK_INT < 8)
{
webView.getSettings().setPluginsEnabled(true);
}
else
{
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
}
webView.setWebChromeClient(new WebChromeClient() { });
webView.setWebViewClient(new WebViewClient());
...
同时硬件加速已开启:
<application
android:hardwareAccelerated="true"
...
并且我也成功地根据这篇教程: http://anuraagsridhar.wordpress.com/2013/03/13/rendering-an-android-webview-or-for-that-matter-any-android-view-directly-to-opengl/,在OpenGL中渲染了 WebView(除了播放视频)。
WebView的额外初始化(使其始终处于“纵向”并适合于纹理):
Point p = new Point();
activity.getWindow().getWindowManager().getDefaultDisplay().getSize(p);
webView.setLayoutParams(new ViewGroup.LayoutParams(p.x, p.y));
surfaceTexture.setDefaultBufferSize(p.x, p.y);
WebView的onDraw方法被重写:
@Override
public void onDraw(Canvas c)
{
try
{
Point p = new Point();
activity.getWindow().getWindowManager().getDefaultDisplay().getSize(p);
Canvas canvas = surfaceTexture.lockCanvas(new Rect(0,0,p.x,p.y));
canvas.save();
canvas.translate(-scrollL, -scrollT);
super.onDraw(canvas);
canvas.restore();
surfaceTexture.unlockCanvasAndPost(canvas);
}
catch (Surface.OutOfResourcesException e)
{
throw new RuntimeException(e);
}
}
尝试使用上述技巧在Webview中播放YouTube视频时,视频矩形是黑色的(但可以听到声音)。 我怀疑硬件加速在表面纹理上无法正常工作。
因此问题是: 有没有办法在OpenGL纹理上播放YouTube视频?