Android扩展文件

Android扩展文件,android,zip,apk,unzip,apk-expansion-files,Android,Zip,Apk,Unzip,Apk Expansion Files,我试图做一个应用程序,其中包含约80mo的PNG(这是一个离线应用程序,所以我必须存储在手机上) 该应用程序在本地运行良好,但我无法上传一个>50mo的apk。因此,我试图实现一个扩展文件,其中将包含我的所有PNG。因此,我在Linux上使用这个简单的命令:\u zip\u0\u main.1.com.ctai.irisst.zip\u*\ upng\ucode>在我的/res/drawable mdpi上创建我的扩展文件,然后手动将其放入/Android/data/com.ctai.iriss

我试图做一个应用程序,其中包含约80mo的PNG(这是一个离线应用程序,所以我必须存储在手机上)

该应用程序在本地运行良好,但我无法上传一个>50mo的apk。因此,我试图实现一个扩展文件,其中将包含我的所有PNG。因此,我在Linux上使用这个简单的命令:
\u zip\u0\u main.1.com.ctai.irisst.zip\u*\ upng\ucode>在我的/res/drawable mdpi上创建我的扩展文件,然后手动将其放入
/Android/data/com.ctai.irisst/

然后,我用它来解压手机存储器中的所有数据,但当我启动应用程序时,我只得到一个大约10秒的空白屏幕,然后Android告诉我应用程序没有响应。我可以在文件浏览器中看到~10个PNG图像被解压缩,在
Logcat
中,每秒提取1个文件。(如果我使用缓冲区,加载应用程序仍然需要>20秒)

我已经实现了以下库:

"downloader_library","licencing_library","Sample_downloader" and "zip_file"  
但我当时并没有真正使用它。(我应该吗?怎么做?)


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

您不需要解压缩软件包。您可以通过以下方式读取扩展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


你读过这本书了吗?这很简单。

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

这篇文章最后为人们提供了一些有用的信息,因为apk扩展的工作方式发生了一些变化,而且如果您使用Android Studio使库工作,也会有一些变化

注1

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

注2

如果您使用的是AndroidStudio,并且希望使用downloader库,那么不要将包名和java文件复制到您自己的app src目录中。在eclipse中导入下载程序库并选择export=>gradle构建文件。之后,您可以在android studio中将库作为模块导入

注3

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

顺便说一句

有了这些库,实现apk扩展下载非常容易,只要确保:

  • 您的活动(您希望在其中实现下载的活动) 未完成下载时扩展包的 自动)实现IDownloaderClient

  • 您设置了服务和接收者,并在清单中设置了它们

  • 服务类中的BASE64_公钥是正确的。上传 第一个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版本(它首先添加的版本)关联

    使用谷歌提供的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);
    
    expansionFile.getInputStream(pathToFileInsideZip);`
    
    现在,您可以从这个assetFileDescriptor获得一个文件描述符,并在mediaplayer中使用它,让mediaplayer播放视频的正确语法还需要第二个和第三个参数。。可以从AssetFileDescriptor获得startoffset和长度

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

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

    AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);
    
    expansionFile.getInputStream(pathToFileInsideZip);`
    
    还要确保你不压缩压缩压缩的视频,这是工作! 例如,不压缩.mp4文件:

    zip -n .mp4 -r zipfile.zip . -x ".*" -x "*/.*"
    

    你可以在Google Play store中添加扩展文件(如果这就是为什么你不能让你的apk>50m),你还可以添加一个下载屏幕,该屏幕将在应用程序第一次打开时启动,在那里你可以解压缩/下载/更改/获取或任何你想要的图像。是的,我已经尝试阅读了开发者指南,但是作为一个初学者,我很快就迷路了。。。如果我像你告诉我的那样使用这个函数来读取Zip文件,它们会被保存在内存中吗?否则,在布局文件中使用它们可能会很有用