2014-02-05 48 views
1

我的应用程序非常大图像,所以我需要为我的APK提供expansion files。我选择将所有图像存储在ZIP文件中,并使用zip library访问我的图像。困惑于如何从ZipResourceFile(APK扩展文件)访问文件

我的第一个直觉就是在应用程序首次启动时解压所有文件,并将它们存储在应用程序的外部目录中。该指南轻轻地碰了一下我采取不同的方法:如果您使用您的扩展文件存储多媒体文件从ZIP

读取媒体文件,ZIP文件 仍允许您使用Android媒体播放呼叫提供 偏移和长度控制(如MediaPlayer.setDataSource()和 SoundPool.load())。为了达到此目的,在创建ZIP 包时,您不得对媒体文件执行额外的压缩操作 。

所以我想我只需要从压缩文件中得到一个输入流,但我真的不知道应该打开这个zip文件多久。

假设我有一个画廊活动,其中ViewPager每页显示一个图像。我是否在onCreate中打开我的扩展zip文件并在onDestroy中关闭它,或者我打开并关闭每个加载的新图像的文件?

回答

0

从API级别9开始,您可以使用jobb tool打包资源并使用StorageManager来挂载/卸载OBB文件。如果需要,您也可以使用此工具对资产进行加密。

OBB是一种提供大量二进制资源的好方法,无需将它们打包到APK中,因为它们的大小可能为几GB。但是,由于它们的大小,它们很可能存储在可从所有程序访问的共享存储池中。

...

的OBB将继续安装,只要在StorageManager参考由应用程序举行。一旦此参考文献丢失,正在使用的OBB将被卸载。通过此调用注册的OnObbStateChangeListener将收到此操作的成功或失败。

我猜想一个挂载的OBB文件可以在任何意外的时间下载(例如,当用户打开USB大容量存储器时),因此请特别注意您的OnObbStateChangeListener。从this question

例子:

storage = (StorageManager) getSystemService(STORAGE_SERVICE); 
storage.mountObb(obbFilepath, "optional_encryption_key", myListener); 

您可以使用obbContentPath读取文件,就像他们会在磁盘上。

private final OnObbStateChangeListener myListener = new OnObbStateChangeListener() { 
    @Override 
    public void onObbStateChange(String path, int state) { 
     super.onObbStateChange(path, state); 
     d(path + " changed to state " + state); 
     switch (state) { 
      case ERROR_ALREADY_MOUNTED: 
      case ERROR_COULD_NOT_MOUNT: 
      case ERROR_COULD_NOT_UNMOUNT: 
      case ERROR_INTERNAL: 
      case ERROR_NOT_MOUNTED: 
      case ERROR_PERMISSION_DENIED: 
      case UNMOUNTED: 
       //TODO 
       break; 
      case MOUNTED: 
       String assetsPath = mStorageManager.getMountedObbPath(mPathToObb); 
       if (assetsPath == null) throw new NullPointerException("Could not get path to mounted OBB path"); 
       d("Checking if " + assetsPath + "/path/to/file exists"); 
       File f = new File(assetsPath + "/path/to/file"); 
       d("" + f.exists());      
       break; 
      default: 
       break; 
     } 
    } 
};