我的目标:
下载包含视频和 JS 文件的 zip 文件。创建一个运行 JS 文件的 webview,该文件(除其他外)包含一个视频标签来播放该视频文件。
问题:当我尝试播放视频时,我收到一条错误消息“抱歉,无法播放此视频”。在 logcat 我得到:错误(1,-2147483648)
下面是解压文件的代码:
String path = context.getFilesDir().getPath()+"/";
InputStream is;
ZipInputStream zis;
try {
is = new FileInputStream(zip file);
zis = new ZipInputStream( new BufferedInputStream(is));
ZipEntry ze = null;
while ((ze = zis.getNextEntry()) != null) {
String filename = ze.getName();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count;
FileOutputStream fout =
_context.openFileOutput( path + filename, Context.MODE_WORLD_READABLE );
while ((count = zis.read(buffer)) != -1) {
baos.write(buffer, 0, count);
baos.toByteArray();
fout.write(baos.toByteArray());
baos.reset();
}
fout.close();
zis.closeEntry();
baos.close();
}
zis.close();
}
为了显示视频,我覆盖了 MraidWebChromeClient.onShowCustomView:
super.onShowCustomView(view, callback);
if (view instanceof FrameLayout) {
FrameLayout frame = (FrameLayout) view;
if (frame.getFocusedChild() instanceof VideoView) {
VideoView video = (VideoView) frame.getFocusedChild();
frame.removeView(video);
Activity a = (Activity)getContext();
a.setContentView(video);
video.setOnCompletionListener(this);
video.setOnErrorListener(this);
video.start();
}
}
我不认为视频文件、路径或 JS 有错误,因为:
- 如果将视频作为资源包含在 res 中或通过外部 http 链接流式传输,则视频可以正常播放。
- 加载 js 文件时,我使用 loadDataWithBaseURL 并且所有其他图像元素都显示得很好。
- 我已将文件从 res 复制到本地应用程序文件夹(使用与解压缩代码类似的代码)并发生相同的错误。
我在想:
- 文件在解压缩/复制时被损坏
- 从 webview 播放本地视频存在权限问题(即使我已将文件设置为 world_readable。(从此链接WebView NOT opening android default video player?)
对此问题的任何见解将不胜感激!
ķ
Ps:有谁知道为什么在普通的网络浏览器中它会下载 .mp4 链接,而在其他情况下它会尝试流式传输它们?
编辑:在研究了这两篇文章后,似乎表明 Android 具有防止这种情况发生的安全性: Android - 从应用程序的私有文件夹加载视频在 web 视图 中播放应用程序本地视频 (.mp4) 将文件复制到公共外部工作正常。
关于 Ps:为什么有些视频流和一些被下载,Android 3 不支持从 https 流,所以会下载文件。