tay*_*ess 7 video html5 android local webview
我正在构建一个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>
Run Code Online (Sandbox Code Playgroud)
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");
Run Code Online (Sandbox Code Playgroud)
第一个视频有效,第二个没有.我为它尝试了不同的值source
,它们都不适合我:
<source src="BigBuck.m4v" />
<source src="file:///android_asset/html_test/BigBuck.m4v" />
Run Code Online (Sandbox Code Playgroud)
不确定这是否相关,但是当我按下播放时,请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)
Run Code Online (Sandbox Code Playgroud)
我不知道这里的问题是什么.任何帮助将非常感激.
Slartibartfasts 帮助我解决了这个问题。由于这只是一条评论,所以我必须自己发布。
本质上是一个权限问题。这是他发布的链接。建议的复制文件的方法MODE_WORLD_READABLE
已被弃用,请使用下面链接中描述的方法并将文件保存在外部存储中
我必须将文件复制到外部存储,并在那里访问视频文件。由于Android的几个版本中外部存储的路径不同,因此我复制了所有相关的HTML文件(包括所有JS、图形和视频文件)。请参阅复制文件,如果您有子文件夹,请向下滚动以获取答案。
以下是我的复制方法:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的onCreate
呼唤中
copyAssets("matrix");
Run Code Online (Sandbox Code Playgroud)
矩阵是我的资产中保存所有文件和子文件夹的文件夹。