一些有用的信息对于最终出现在这篇文章中的人来说,因为有一些事情改变了 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 扩展下载,只需确保:
您的活动(当下载尚未自动完成时,您想要实现下载扩展包的活动)实现 IDownloaderClient。
您设置服务和接收器并将它们设置在您的清单中。
服务类中的 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 "*/.*"