在 Android 上的 WebView 中播放本地视频
Posted
技术标签:
【中文标题】在 Android 上的 WebView 中播放本地视频【英文标题】:Playing local video in WebView on Android 【发布时间】:2012-12-21 02:52:27 【问题描述】:我正在构建一个带有WebView
的应用程序,该应用程序应该播放视频,该视频保存在本地。奇怪的是,视频播放器无法处理本地视频文件。它确实会播放保存在服务器上的视频。
本地文件(html和视频)保存在文件夹assets/html_test
这是文件。
HTML
<div class="video-container">
<p>Server</p>
<video poster="video/star.png" controls>
<source src="http://broken-links.com/tests/media/BigBuck.m4v" />
</video>
</div>
<div class="video-container">
<p>local</p>
<video poster="video/star.png" controls>
<source src="BigBuck.m4v" />
</video>
</div>
onCreate in Activity
WebView browser = (WebView) findViewById(R.id.browser);
WebSettings webSettings = browser.getSettings();
webSettings.setjavascriptEnabled(true);
webSettings.setPluginState(WebSettings.PluginState.ON_DEMAND);
webSettings.setAllowFileAccessFromFileURLs(true);
browser.setWebChromeClient(new WebChromeClient());
browser.loadUrl("file:///android_asset/html_test/video.html");
第一个视频有效,第二个无效。我为source
尝试了不同的值,但它们都不适合我:
<source src="BigBuck.m4v" />
<source src="file:///android_asset/html_test/BigBuck.m4v" />
不确定这是否相关,但我一按下播放键,logcat
就会发出这个:
01-07 12:19:18.073: E/MediaPlayer(32542): error (1, -2147483648)
01-07 12:19:18.073: E/MediaPlayer(32542): Error (1,-2147483648)
我不知道这里有什么问题。任何帮助将不胜感激。
【问题讨论】:
我认为应该是file://
而不是file:///
,请确认一下。
这个错误一般是因为你正在播放的文件的格式在Android上不支持。 developer.android.com/guide/appendix/media-formats.html 或者:权限问题?看看这是否有帮助:weston-fl.com/blog/?p=2988
@taymless 你可以尝试在你的 html 中使用 <embed>
而不是 <video>
吗?
@taymless 你能告诉我你是怎么解决你的问题的。我也有同样的问题。我想显示存储在资产文件夹中的视频。请尽快回复
@swapniladsure 看看我发布并接受的答案。您必须启用对视频文件的文件访问。我将文件复制到外部存储,包括所有 HTML 资产。这一切都在下面解释......
【参考方案1】:
Slartibartfasts 帮我解决了这个问题。由于这只是一个评论,我必须自己发布。
本质上这是一个权限问题。 Here is the link he posted。建议使用MODE_WORLD_READABLE
复制文件的方法已弃用,请使用下面链接中描述的方法并将文件保存在外部存储中
我必须将文件复制到外部存储,并在那里访问视频文件。由于在几个版本的android中外部存储的路径不同,我复制了所有相关的HTML文件(包括所有JS、图形和视频文件)。请参阅copying files,如果您有子文件夹,请向下滚动以获得答案。
这是我的复制方法:
private void copyAssets(String path)
String[] files = null;
try
files = getAssets().list(path);
catch (IOException e)
e.printStackTrace();
if (files.length == 0)
copyFile(path);
else
File dir = new File(getExternalFilesDir(null), path);
if (!dir.exists())
dir.mkdir();
for (int i = 0; i < files.length; i++)
copyAssets(path + "/" + files[i]);
private void copyFile(String filename)
InputStream in = null;
File file;
OutputStream out = null;
try
in = getAssets().open(filename);
catch (IOException e)
Log.e(TAG, "ERROR WITH in = getAssets().open: " + filename);
e.printStackTrace();
file = new File(getExternalFilesDir(null), filename);
try
out = new FileOutputStream(file);
catch (FileNotFoundException e)
Log.e(TAG, "ERROR WITH out = new FileOutputStream(file);");
e.printStackTrace();
byte[] data;
try
data = new byte[in.available()];
in.read(data);
out.write(data);
in.close();
out.close();
catch (IOException e1)
e1.printStackTrace();
在我的onCreate
我打电话
copyAssets("matrix");
matrix 是我的资产中保存所有文件和子文件夹的文件夹。
【讨论】:
嘿,谢谢。我只是想验证一下,在此示例中,您的资产位于file:///android_asset/matrix
中?
是的,在我复制它们之前,这就是文件所在的路径。之后,来自getExternalFilesDir(null)
的路径将根据操作系统版本而有所不同。
我得到一个致命的执行:java.lang.OutOfMemoryError以上是关于在 Android 上的 WebView 中播放本地视频的主要内容,如果未能解决你的问题,请参考以下文章
YouTube 视频在 WebView Android 中仅在屏幕旋转时播放音频
HTML5 视频未在 android webview 中播放
Android webview html5 视频自动播放在 android 4.0.3 上不起作用
Android WebView播放html5视频,退出全屏后为啥就是黑屏了