0

我的目标:

下载包含视频和 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 复制到本地应用程序文件夹(使用与解压缩代码类似的代码)并发生相同的错误。

我在想:

对此问题的任何见解将不胜感激!

ķ

Ps:有谁知道为什么在普通的网络浏览器中它会下载 .mp4 链接,而在其他情况下它会尝试流式传输它们?

编辑:在研究了这两篇文章后,似乎表明 Android 具有防止这种情况发生的安全性: Android - 从应用程序的私有文件夹加载视频在 web 视图 中播放应用程序本地视频 (.mp4) 将文件复制到公共外部工作正常。

关于 Ps:为什么有些视频流和一些被下载,Android 3 不支持从 https 流,所以会下载文件。

4

1 回答 1

0
  1. 由于您正在从 SD 卡解压缩/读取视频,因此请确保将以下行添加到您的清单文件中:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  2. 由于您使用的是 JS,请确保在您的 WebView 中启用它,如下所示:

    private WebView mWebView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            ...
            ...
            mWebView = (WebView) findViewById(R.id.webview);
            mWebView.getSettings().setJavaScriptEnabled(true);
            ...
    }
    
  3. 至于视频播放,到目前为止我发现的最可靠的解决方案是将其交给原生媒体播放器应用程序(因为我发现 WebView 确实有问题)。为了实现这一点,您需要将JavaScript 代码绑定到 Android 代码,以便当用户点击视频缩略图时,您可以创建相应的意图并启动媒体播放器应用程序,如下所示:

    Intent i = new Intent();
    i.setAction(android.content.Intent.ACTION_VIEW);
    File file = new File(PATH_TO_YOUR_VIDEO);
    i.setDataAndType(Uri.fromFile(file), "video/*");
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    mContext.startActivity(i);
    
  4. [更新]根据官方文档(请参阅“访问外部存储上的文件”下),

“如果您使用API 级别 8 或更高版本,请使用getExternalFilesDir()打开一个文件,该文件代表您应该保存文件的外部存储目录”。

“如果您使用API 级别 7 或更低,请使用getExternalStorageDirectory()打开代表外部存储根目录的文件”。

您的解压缩代码包含该行String path = context.getFilesDir().getPath(),请尝试按照上面的方式对其进行修改。

于 2012-06-28T16:31:04.013 回答