PR

【メモ】Android ファイルの読み書き

Android
この記事は約4分で読めます。
スポンサーリンク

最近作りたいものがあるのでAndroidアプリ作成について、少しずつ調べてコピペして動かして。とかやってます。
忘れっぽいので(コード見ればいいんだけど)、ブログにメモ書き。

■ assetsの読み込み

AssetManager as = getResources().getAssets();
InputStream  is = as.open( fileName );

■ res/rawの読み込み

Resources res = this.getResources();
InputStream is = res.openRawResource( R.raw.fileName );

assetsは普通にfileNameのところが~~.txtとか。ディレクトリを作って入れてもOKみたい。
res/rawはリソースIDで指定する。R.raw.~~。rawの中にディレクトリ作って入れるのはNGみたい。ファイル名でしか判別しないので、同じファイル名で拡張子違いのファイルを入れるのもダメ。

assetsとres/rawってどうやって使い分けるもんなんだろう。
って調べてたら、解像度とか言語判別の機能を使わない様なファイルはassetsに入れるのが良いみたいなことが書いてあるサイトがあった。
値に変更が無い読み込みしかしないcsvファイルとか、sqlファイルとかはassetsで、アイコン画像とか言語によって切り替えるものはresに入れれば良いと。
今はそれくらいの理解で良いことにしておこう。

■ 内部ストレージのファイル読み書き

InputStream  in  = openFileInput( fileName );
OutputStream out = openFileOutput( fileName );

これでいいらしい。内部ストレージはユーザーからは見えない場所にあって
/data/data/<package-name>/files/fileName
だそう。エミュレータだとDDMSのファイル・エクスプローラーから開けるけど、実機(root取ってない市販状態の端末)だとdataを開こうとしても展開されないから見えない。

/data/data/<package-name>/files/のパスを知るにはgetFilesDir();を使う。

■外部ストレージのファイル読み書き
外部ストレージって書いてあるから端末に挿入しているmicroSDカードの事だと思い込んでしまったんだが、端末によるらしい。
(/mnt/sdcard/ としている所は端末によって /storage/sdcard/ だったりするので注意)

File path = this.getExternalFilesDir( type );

typeの所に、Environment.DIRECTORY_MUSIC とか DIRECTORY_RINGTONES などを指定すると、Androidは適切なファイル分けで扱ってくれるらしい。(?) 見たものをメモしているだけだけど、DIRECTORY_RINGTONESを指定して保存すると着信音として扱ってくれるとかそう言う感じらしい。試してないのでよくわからないが、
/mnt/sdcard/Android/data/<package-name>/files/Ringtones
を返してくれるんだと思う。
typeをnullにすると、アプリケーションファイルのルートディレクトリパスが返ってくる。
/mnt/sdcard/Android/data/<package-name>/files/

ちなみにこの指定の場合、アンインストール時に一緒に削除される。アンインストールしてもデータを残しておきたい場合は、下の方法をとる。

File path = Environment.getExternalStoragePublicDirectory( type );

typeの所は上と同じだが、nullは動作しない模様。
/mnt/sdcard/Ringtones
のような共通の保存場所のパスが返ってくるので、アンインストール時もデータは残る。

あとは、ネットでよく見かけるコレ

File path = Environment.getExternalStorageDirectory();

/mnt/sdcard/
が返ってきます。

手元にあるのはXperia Aなんだけども、microSDを挿入していなくても端末内にファイルを作れるので、外部ストレージがSDカードではないのはすぐに確かめられたけど、ネットでいろいろ調べてたら環境変数(EXTERNAL_STORAGE2とかEXTERNAL_STORAGE_DOCOMO)を使って判断したり、/proc/mountsをスキャンしたり?なんだかいろいろやってるサイトを見かけて難しいわからん。って感じだった。

とりあえず今作ろうとしてるアプリはmicoroSDに保存できないと困る!ってわけでもないからこれ以上探すの時間もったいないし、他のことも調べてコピペして実行とかやってみたいのでこれくらいにしとこうと思う。

コメント

タイトルとURLをコピーしました