2014年11月7日金曜日

【Android】アセットフォルダの中身を端末にコピーする

assetsフォルダの中身を端末にコピーして使うという技がよく登場する。
たとえばCで書かれたライブラリを使わないといけない場合など。AndroidNDKを使っての連携とかごちゃごちゃややこしいことをやらされる。
Cで書かれたコードからはアセットフォルダの中身にアクセス出来ないらしい。だから端末にコピーしたファイルのパスを渡してやる必要が生じる。

ややこしいけど、以下のふたつは別物と考える。
■アセットフォルダの中身(開発している時ローカルにファイルがある)
■端末にコピーされたファイル(インストール後、端末の保存領域に登場する=ローカルの時は存在しない)

WebViewなんかで読み込ませる時、上記ふたつはURLが違う。

アセットフォルダ内
    file:///android_asset/ファイル名
     →これは多分、AndroidにインストールされたAPKファイルの中に存在する。

端末にコピーしたもの
    file:///data/data/パッケージ名/files/ファイル名
    ※URLでなくファイルパスで言うなら「/data/data/パッケージ名/files/ファイル名」



今回のメモの中心の話題。
********
アセットフォルダの中身を、ディレクトリ構造を維持したまま、端末の 「/data/data/パッケージ名/files/」以下にコピーしたい。
********

要点だけいうと、
■ディレクトリだけあらかじめ端末内に作っておく。
■端末へのファイル出力は「/data/data/パッケージ名/files/」直下にしか出来ない。
■ファイルを書き出した直後に、 ここにあってほしいというディレクトリに、書き出したファイルを移動させる。

そのままコピペで使えるソースじゃなくて申し訳ないが、ファイル書き出し直後に次のようにして移動の処理を作ったらうまく行った。
***********
/////////////////////////////////////////
//書き出したファイルを適切なディレクトリに移動
File file_in_old_place    = new File(書き出したばかりのファイルの端末内ファイルパス);
//望ましい保存場所
File file_in_proper_place = new File(ファイルの、そこにあってほしいという端末内ファイルパス);

//リネーム(ディレクトリ変更が出来るメソッド)
file_in_old_place.renameTo(file_in_proper_place);
***********


1メガを超えるファイルを端末内にコピーしたい時、ZIPにしておいて解凍するというテクがあるけど、これにも応用できた。
■アセットフォルダ内に大きなZIPを置いておく。1ファイルで1zip。
■「/data/data/パッケージ名/files/」直下に解凍。
■移動先ディレクトリを作っておく。
■解凍されたファイルをrenameTo()で移動。


0 件のコメント:

コメントを投稿