キノコの自省録

テクノロジーとコンテンツの融合を目指して

Expansion Filesについて(2) - obb利用編

前回の続き
http://d.hatena.ne.jp/kinokorori/20130710/1373467687


拡張ファイルを利用する方法について。

  • 拡張ファイルの保存先

拡張ファイルをテストする場合は、拡張ファイル保存先に手動でファイルをpushしてください、
Googleドキュメントには書いてあります。
(ただ、基本的に手動書き込み禁止エリアなので、おそらくRoot化する必要有り)
ダウンロード保存先は、

File exdir = Environment.getExternalStorageDirectory();
StringBuilder sb = new StringBuilder();
sb.append(exdir.getAbsolutePath());
sb.append("/Android/obb/");
sb.append(mContext.getPackageName());
sb.append("/");
File file = new File(sb.toString());

で取得できます。
または、Downloader LibraryのHelpersクラスを利用すると、もっと簡単に取得できます。
Downloader Libraryは、obbダウンロード編で紹介予定。


なお、ファイル名は、
(main|patch).(versionCode).(package name).obb
です。
mainの拡張ファイルで、versionCodeが1,package nameがjp.hogehoge.foobarなら、
main.1.jp.hogehoge.foobar.obbとなります。
前回述べたとおり、拡張ファイルは中身が何であっても拡張子がobbになります。


・obbのマウント
拡張ファイルがobb形式である場合についての利用方法です。
obb形式はディスクイメージの一種なのでマウントして利用します。
具体的には、

StorageManager storageMgr = (StorageManager)getSystemService(STORAGE_SERVICE);
storageMgr.mountObb(obbFilePath, mountPass, obbStateChangeListener);

でマウントします。
第1引数にはobbファイルのパス、
第2引数にはobbファイルのパスワード(暗号化していなければnull)
第3引数にはリスナー(OnObbStateChangeListener)オブジェクトを指定します。


マウントに成功すると、OnObbStateChangeListenerの、onObbStateChangeメソッドが呼び出されます。
onObbStateChangeの第1引数はオリジナルのobbファイルパス、
第2引数はステータスコードです。ステータスコードはOnObbStateChangeListenerクラスに定義されています。
マウントに成功すると、OnObbStateChangeListener.MOUNTEDステータスで呼び出されます。
このとき、

public void onObbStateChange(String path, int state) {
  String mountPath = null;
  if (state == OnObbStateChangeListener.MOUNTED) {
    StorageManager stmgr = (StorageManager)getSystemService(STORAGE_SERVICE);
    mountPath = stmgr.getMountedObbPath(path);
  }
}

のようにすることで、マウント先のパスを取得することができます。
このマウント先のパスは通常のディレクトリアクセスと同様です。
つまり、FileInputStreamなどでデータを読み出すことができます。


・Zipの場合
Android SDKのplay_expansionパッケージにはzip読み込み用ライブラリが用意されているので、
これを使うと、比較的楽にファイルを取り出すことができます。
(Android SDK)/extras/google/play_apk_expansion/zip_file
をインポートして、ライブラリ設定を行うと利用できるようになります。
downloader_sampleに、このライブラリの使用例が載っています。
(ちょっと投げやり)