4

我正在尝试做一个包含〜80mo PNG的应用程序(它是一个离线应用程序,所以我必须将它们存储在手机上)。

该应用程序在本地运行良好,但我无法上传 > 50mo 的 apk。所以我正在尝试实现一个包含我所有 PNG 的扩展文件。所以我在 Linux 上使用这个简单的命令:_zip_ -0 _main.1.com.ctai.irisst.zip_ *_.png_在我的 /res/drawable-mdpi 上创建我的扩展文件,然后手动将其放入/Android/data/com.ctai.irisst/
然后,我使用此代码解压缩手机存储中的所有数据,但是当我开始该应用程序,我只有 10 秒的空白屏幕,然后 Android 告诉我该应用程序没有响应。我可以在文件资源管理器中看到大约 10 个 PNG 图像被解压缩,并且Logcat每秒提取 1 个文件。(如果我使用缓冲区,加载我的应用程序仍然需要 >20 秒)

我已经实现了以下库:

"downloader_library","licencing_library","Sample_downloader" and "zip_file"  

但我暂时并没有真正使用它。(我应该吗?怎么做?)

我的问题很简单,我怎样才能简单地创建一个扩展文件并使用我的图像而不影响用户体验?我没有找到这么多关于扩展文件的教程,也没有示例项目,所以我有点迷茫。

4

3 回答 3

3

你不需要解压缩你的包。您可以使用以下命令在扩展 ZIP 文件中读取所有 PNG:

// Get a ZipResourceFile representing a merger of both the main and patch files
ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(appContext,
        mainVersion, patchVersion);

// Get an input stream for a known file inside the expansion file ZIPs
InputStream fileStream = expansionFile.getInputStream(pathToFileInsideZip);

**编辑**

请注意,在上面的代码中,InputStream将指向 ZIP 存档中的文件,而不是 ZIP 文件本身。例如,如果您将flower.png放在 ZIP 存档中名为background的目录下,您可以对该文件有一个 InputStream,如下所示:

InputStream fileStream = expansionFile.getInputStream("background/flower.png");

**编辑**

我认为您放置 ZIP 文件的位置不正确。根据开发者指南:

如果你的包名是com.example.android,你需要在共享存储空间上创建目录Android/obb/com.example.android/。

测试成功后,您可以通过开发者控制台上传您的扩展 ZIP 和您的 APK。

您是否阅读过APK 扩展文件?这很简单。

于 2013-01-03T13:34:45.677 回答
1

一些有用的信息对于最终出现在这篇文章中的人来说,因为有一些事情改变了 apk 扩展的工作方式,以及如果你使用 Android Studio 来使库工作。

注1

您不能再使用草稿,因为获取扩展文件的链接尚未激活。您必须先使用扩展文件将版本上传到 Alpha 或 Beta。(只能从您上传的第二个 apk 开始添加扩展文件)因此,请确保在单击 APK 下的开发者发布部分中的详细信息时看到列出的 apk 扩展文件。

笔记2

如果您使用的是 android studio 并且想要使用下载器库,请不要将包名和 java 文件复制到您自己的应用程序 src 目录中。在eclipse中导入下载器库,选择export => gradle build files。之后,您可以将库作为模块导入 android studio。

注3

不确定这一点,但我也认为有必要通过 Play 商店至少下载一次应用程序,并使用测试设备上的帐户访问它。因此,如果您正在使用 alpha,请创建一个 google+ 测试组并将您自己或其他测试设备添加到其中。

顺便提一句

使用这些库,很容易实现 apk 扩展下载,只需确保:

  1. 您的活动(当下载尚未自动完成时,您想要实现下载扩展包的活动)实现 IDownloaderClient。

  2. 您设置服务和接收器并将它们设置在您的清单中。

  3. 服务类中的 BASE64_PUBLIC_KEY 是正确的。上传第一个 apk => 在您的应用程序下的开发人员控制台中查看服务和 API => 此应用程序的许可证代码。

此代码用于查看是否可以在设备上找到扩展文件:

boolean expansionFilesDelivered() {
    for (XAPKFile xf : xAPKS) {
        String fileName = Helpers.getExpansionAPKFileName(this, xf.mIsMain, xf.mFileVersion);
        Log.i(TAG, "Expansion filename " +fileName);
        if (!Helpers.doesFileExist(this, fileName, xf.mFileSize, false))
            return false;
    }
    return true;
}

它使用 XAPKS 类,它代表一个扩展文件,无论是主文件还是补丁文件,具有一定的文件大小(字节)并与 apk 版本(它第一次添加的那个)相关联。

private static class XAPKFile {
        public final boolean mIsMain; // true
        public final int mFileVersion; //example 4
        public final long mFileSize; //example 126515695L
        // example => main expansion that was first introduced in apk version 4 and is 126515695 bytes in size

        XAPKFile(boolean isMain, int fileVersion, long fileSize) {
            mIsMain = isMain;
            mFileVersion = fileVersion;
            mFileSize = fileSize;
        }
    }

使用 google 提供的 zip 工具(com.android.vending.zipfile)直接从扩展文件中读取电影文件和其他内容也很容易。

首先使用库中提供的方法获取扩展文件,参数是整数,代表你的主要扩展apk版本(你需要的扩展包首先添加的apk版本)和补丁apk版本。

ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(context, APKX_MAIN_APK, APKX_PATCH_APK);

视频

要直接从此 zipresourcefile 播放视频:

AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);

现在从这个assetFileDescriptor你可以得到一个FileDescriptor并在你的媒体播放器中使用它,让你的媒体播放器播放视频的正确语法还需要第二个和第三个参数。无论是你可以从AssetFileDescriptor获得的起始偏移量和长度。

player.setDataSource(a.getFileDescriptor(), a.getStartOffset(), a.getLength());

其他

对于所有其他内容(如图像),您只需获取 zipresourcefile 的输入流:

expansionFile.getInputStream(pathToFileInsideZip);`

还要确保您不压缩 zip 中的视频以使其正常工作!例如不压缩 .mp4 文件:

zip -n .mp4 -r zipfile.zip . -x ".*" -x "*/.*"
于 2014-09-24T20:00:31.577 回答
0

即使是 zip 文件,它仍然需要存储在 obb 文件夹中。

于 2014-03-22T10:57:04.997 回答