前回の続き
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に、このライブラリの使用例が載っています。
(ちょっと投げやり)