2013-01-03 42 views
4

我想做一个应用程序,其中包含〜80mo的PNG(这是一个离线应用程序,所以我必须将它们存储在手机上)。Android扩展文件

该应用程序在本地完美工作,但我无法上传apk> 50mo。所以我试图实现一个包含我所有PNG的扩展文件。所以我在Linux上使用这个简单的命令:_zip_ -0 _main.1.com.ctai.irisst.zip_ *_.png_在my/res/drawable-mdpi上创建我的扩展文件,然后手动将它放到/Android/data/com.ctai.irisst/
然后,我使用this code解压缩了手机存储器上的所有数据,但当我启动应用程序时,我只能看到10像素的黑屏,然后Android告诉我应用程序没有响应。我可以在文件浏览器中看到〜10个PNG图像解压缩,并且在Logcat中每秒提取1个文件。 (如果我使用缓冲区,它仍然采取> 20岁载入我的应用程序)

我已实现了以下库:

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

但我并没有真正使用它的那一刻。 (我应该怎么做?)

我的问题很简单,我如何简单地创建扩展文件并使用我的图像而不会干扰用户体验?我还没有找到关于扩展文件的很多教程,也没有示例项目,所以我有点迷路。

+0

您可以在谷歌新增扩充档案Play商店(如果这就是为什么你不能有自己的APK>为50公尺),也可以添加将要推出下载屏幕第一次打开应用程序,在那里你可以解压缩/下载/更改/获取或任何你想要的,你的图像。 –

回答

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文件本身。例如,如果您放置一个名为背景您的ZIP压缩包里目录下flower.png,您可以按如下有一个InputStream该文件:

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

**编辑**

我认为你放置ZIP文件的位置不正确。据开发人员指南:

如果你的包名是com.example.android,您需要在共享存储空间 创建 目录安卓/ OBB/com.example.android /。

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

您是否阅读了APK Expansion Files?这非常简单。

+0

是的,我试过阅读开发者指南,但作为初学者,我很快就失去了......如果我使用函数来读取Zip文件,你告诉我,它们会被保存在内存中吗?在布局文件中使用它们可能是有用的,否则我将不得不在活动中声明它。 – k0mfushee

+0

你会使用它们的用户界面,或者,例如,填充它们在一个网格,如缩略图? –

+0

如果你要使用它们作为UI(让我们说按钮背景),你必须以编程方式进行。只要阅读特定的文件并从它创建一个drawable并将其设置为onCreate()上的View即可。 –

0

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

1

由于有些事情在apk扩展的工作方式中发生了变化,并且您正在使用Android Studio来使这些库工作,所以在这篇文章中最终会出现一些helfull信息。

注1:

不能使用了草案为纽带,以获得扩展文件不会被激活呢。您必须先使用扩展文件将版本上传到Alpha或Beta。 (只能通过第二个apk上传和扩展才能添加扩展文件)因此,请确保在单击APK下的开发者发布部分中的详细信息时看到列出的apk扩展文件。

注2:

如果您正在使用Android的工作室,并希望利用下载库的不只是包名和java文件复制到自己的应用程序的src目录。在eclipse中导入下载器库并选择export => gradle构建文件。之后,您可以将该库作为android studio中的模块导入。

注3:

不知道这一点,但我也认为这是neccesary通过Play商店下载应用ATLEAST一次,并有机会获得它与你的测试设备上的帐户。因此,如果您正在使用alpha创建一个Google +测试组并添加自己或其他测试设备。

BTW

使用这些库这是很容易实现的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; 
     } 
    } 

它也很容易直接使用,谷歌提供了Zip工具(com.android.vending.zipfile)扩展文件读取电影文件和其他的东西。

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

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

视频

直接从这个zipresourcefile播放视频:从这个assetFileDescriptor

AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip); 

现在,你可以得到FileDescriptor的和您的媒体播放器使用,正确的语法来获得您的媒体播放器播放视频也需要第二个和第三个参数。不管它是从AssetFileDescriptor中获得的起始偏移量和长度。

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

其他

对于所有其他的东西(如图片)你可以得到的zipresourcefile的一个InputStream:

expansionFile.getInputStream(pathToFileInsideZip);` 

另外,还要确保你不压缩视频在这个zip的工作! 例如不压缩.mp4文件:

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