Android:将ZIP解压到内存中并在WebView中显示其内容

发布于 2024-11-29 15:11:02 字数 167 浏览 0 评论 0原文

我有一个 ZIP 文件形式的网站。我想将它解压到内存中(而不是本地磁盘),然后在WebView中显示它。该 ZIP 文件具有包含图像的图像目录,WebView 也应该可以访问这些文件。我正在考虑创建新的 ContentProvider,但我不确定在这种情况下我知道如何创建:)。

请帮助代码示例。 谢谢!

I have a website in a ZIP file. I would like to unzip it in memory (not to local disk) and then display it in WebView. This ZIP file has the image directory with images and these files should also be accessible to WebView. I'm thinking of creating new ContentProvider but I'm not sure I know how to in this case :).

Please help code examples.
Thx!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

a√萤火虫的光℡ 2024-12-06 15:11:02

您可以研究两件事:

  1. 使用管道流,如 FileProvider
  2. 使用新的 APK 扩展作为逻辑的基础 此处

我的内容提供程序中有以下内容:

private ContentProvider.PipeDataWriter<ZipFile> pipe = new EcoPipeDataWriter();

@Override
public AssetFileDescriptor openAssetFile(Uri uri, String mode)
        throws FileNotFoundException {
    ZipFile zip = getZip(uri);
            Bundle data = new Bundle();
            // put file name in bundle
    return new AssetFileDescriptor(openPipeHelper(uri, null, data, zip,
            pipe), 0, zip.getUncompressSize());

}

以及管道流:

@Override
public void writeDataToPipe(ParcelFileDescriptor output, Uri uri, String s, Bundle bundle, ZipFile zipFile) {
    final String filePath = bundle.getString(FILE_PATH_KEY);

    byte[] buffer = new byte[8192];
    FileOutputStream fout = new FileOutputStream(output.getFileDescriptor());
    try {
        // iterate throught zipfile until filenamea has been reach

        InputStream in = zipFile.getInputStream(fileHeader);
        int n;
        while ((n = in.read(buffer)) >= 0) {
            fout.write(buffer, 0, n);
        }
    } catch (ZipException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

You can look into 2 things:

  1. using pipe stream as in FileProvider
  2. Using the new APK expansion as base for your logic here

I have the following in my content provider:

private ContentProvider.PipeDataWriter<ZipFile> pipe = new EcoPipeDataWriter();

@Override
public AssetFileDescriptor openAssetFile(Uri uri, String mode)
        throws FileNotFoundException {
    ZipFile zip = getZip(uri);
            Bundle data = new Bundle();
            // put file name in bundle
    return new AssetFileDescriptor(openPipeHelper(uri, null, data, zip,
            pipe), 0, zip.getUncompressSize());

}

And the pipe stream:

@Override
public void writeDataToPipe(ParcelFileDescriptor output, Uri uri, String s, Bundle bundle, ZipFile zipFile) {
    final String filePath = bundle.getString(FILE_PATH_KEY);

    byte[] buffer = new byte[8192];
    FileOutputStream fout = new FileOutputStream(output.getFileDescriptor());
    try {
        // iterate throught zipfile until filenamea has been reach

        InputStream in = zipFile.getInputStream(fileHeader);
        int n;
        while ((n = in.read(buffer)) >= 0) {
            fout.write(buffer, 0, n);
        }
    } catch (ZipException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文