外部ストレージの特徴として以下の3点が挙げられます。
- デバイスが取り外されていて使用できない場合がある
- ファイルは外部から読み書き可能
(内部ストレージに保存するときみたいに、Context.MODE_PRIVATEを指定して外部に非公開にできない) - 保存したファイルはアプリのアンインストール時に削除される
他アプリから使用するようなデータは外部ストレージに保存します。
外部ストレージが使用可能かチェックする
外部ストレージは常に使用可能とは限らないので、読み書きする前に使用可能かチェックする必要があります。読み書き可能かどうかはEnvironment.getExternalStorageState()の戻り値で判断できます。
チェック用のコードですが、http://developer.android.com/training/basics/data-storage/files.htmlにあるisExternalStorageWritable()とisExternalStorageReadable()がそのまま使えるので、これを使うことにします。
外部ストレージにファイルを作成し、データを保存する
外部ストレージにファイルを作成し、データを書き込むコードは以下のようになります。
// 外部ストレージに書き込み可能かチェック
if (isExternalStorageWritable()) {
FileOutputStream outputStream;
// ※以下、例外処理は省略
// 外部ストレージにファイルを作成し、書き込む。
File file = new File(getExternalFilesDir(null), "myfile.txt");
outputStream = new FileOutputStream(file);
outputStream.write("test".getBytes());
// ちなみにDDMSで確認したところ、確認時の環境下では
// "/mnt/sdcard/Android/data/[パッケージ名]/files/myfile.txt"
// に書き込まれた。
outputStream.close();
}
getExternalFilesDir()の引数にはディレクトリのタイプを指定します。Environment.DIRECTORY_MUSIC や Environment.DIRECTORY_PICTURESといった定数を指定でき、
これらを指定することでディレクトリ内のデータがシステムから適切に扱われるようになります。
例えば、Environment.DIRECTORY_RINGTONESを指定したディレクトリにあるオーディオファイルは、着信音として扱われます。
これらの定数ではなくnullを指定すると、アプリ用ディレクトリのルートディレクトリが返されます。
外部ストレージに保存したファイルからデータを読み込む
ファイルからデータを読み込むコードは以下のようになります。
// 外部ストレージから読み込み可能かチェック
if (isExternalStorageReadable()) {
FileInputStream inputStream;
byte[] buffer = new byte[256];
// ※以下、例外処理は省略
File file = new File(getExternalFilesDir(null), "myfile.txt");
if (file.exists()) {
inputStream = new FileInputStream(file);
inputStream.read(buffer);
String data = new String(buffer, "UTF-8");
inputStream.close();
}
}
0 件のコメント:
コメントを投稿