2014-02-05 46 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; 
     } 
    } 
};