-->

2015年12月

まず、Androidのストレージをちょっと、整理してみる。

Androidのストレージは、APIから見ると、内蔵ストレージ、外部ストレージがある。

古い端末や開発で使うAndroidエミュレータでは、内蔵ストレージは、内蔵ストレージ。外部ストレージはSDカードとなっている。

Nexus7などの内蔵ストレージが大きい端末では、外部ストレージに内蔵ストレージも割り当てられているものがあり(ほとんどがそうなのかな?)、さらにSDカードスロットがあるものもあり、SDカードが外部ストレージの一部に割り当てられたりする。で、厄介なのが、外部ストレージがSDカードかそうでないのか、SDカードのマウント先を知るAPIがなかったりする・・・(/system/etc/vold.fstabを開いてごにょごにょするとわかるらしいが)

あと、Android5.0(APIレベル21)以降では、Environment.isExternalStorageEmulated(path)で外部ストレージがエミュレート(内部ストレージが割り当てられている)かどうかが確認できる。

タイトルの本題に入る。アプリケーションのデータの保存先は、基本的に内蔵ストレージのアプリ用のフォルダに保存することになる。外部ストレージだと、取り出されたり、そもそもなかったりするので保存先としてはむいていないような気がする。あと、ここに保存されたファイルは他アプリからアクセスできなくなっている。

Context.getFilesDir()
アプリで永続的に残すデータの保存に使う。アプリのアンインストールとともに削除される。

Context.getCacheDir()
名前の通り、キャッシュデータを保存するのに使う。ここに保存されたファイルはストレージの空き容量が少なくなると、OSによって勝手に削除されるようなのでその辺も注意しないといけない。アプリのアンインストールとともに削除される。

次に外部ストレージのアプリケーションのデータの保存先は次のようにして取得する。ここに保存されたファイルは、内蔵ストレージと違い他アプリからアクセスできるので注意が必要だ。

Context.getExternalFilesDirs()(Android4.4:APIレベル19〜)
Context.getExternalCacheDirs()(Android4.4:APIレベル19〜)
内蔵ストレージと同様の外部ストレージでのディレクトリの配列を返す。配列になっているのは、外部ストレージが複数あればそれらを配列で返す。外部ストレージに内蔵ストレージが割り当てられいてかつSDカードスロットにSDカードが刺さっている場合などだ。(確認していないが、USBストレージを繋いでる場合も含まれるのかも?)Android4.4以前は、サポートライブラリの次のやつを使う。

ContextCompat.getExternalFilesDirs()(Android1.6:APIレベル4〜)
ContextCompat.getExternalCacheDirs()(Android1.6:APIレベル4〜)

外部ストレージは、取り外せる場合があるのでEnvironment.getExternalStorageState()(Android5.0:APIレベル21〜)でマウントされているか調べる必要がある。

今まであげたのは、アプリごとに用意されているディレクトリだ。Wordみたいなファイルを扱うアプリケーションは、ストレージアクセスフレームワーク(SAF)(Android4.4:APIレベル19〜)のピッカーを使って行う。SAFのピッカーはWindowsのファイル選択ダイアログみたいなもので、ユーザにファイルを選択したり、ファイル名を入力してもらったりするものである。

(追記)
Android4.3以前について。(なのでタイトルを変更)
ContextCompat.getExternalFilesDirs()ContextCompat.getExternalCacheDirs()で得た場所にファイルを書いたりするには、AndroidManifest.xmlにpermissionを設定しとかないといけない。

<uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     android:maxSdkVersion="18" />

このエントリーをはてなブックマークに追加

TypeScript 1.7.3 変更点 - Qiita
このエントリーをはてなブックマークに追加

↑このページのトップヘ