データ ストレージとファイル ストレージの概要

Android は、他のプラットフォームのディスクベース ファイル システムと同様のファイル システムを使用しています。システムには、アプリデータの保存方法として次のような選択肢が用意されています。

  • アプリ固有のストレージ: アプリ専用のファイルを、内部ストレージ ボリューム内の専用ディレクトリ、または外部ストレージ内の別の専用ディレクトリに保存します。他のアプリがアクセスすべきでない機密情報の保存には、内部ストレージ内のディレクトリを使用します。
  • 共有ストレージ: メディアやドキュメントなど、アプリが他のアプリと共有するファイルを保存します。
  • 設定: 非公開のプリミティブ データを Key-Value ペアで保存します。
  • データベース: Room 永続ライブラリを使用して、構造化データを非公開のデータベースに保存します。

これらの選択肢の特徴を次の表にまとめます。

コンテンツの種類 アクセス手段 必要な許可 他のアプリがアクセス可能 アプリのアンインストール時に削除される
アプリ固有のファイル お客様のアプリのみで使用するファイル 内部ストレージからは getFilesDir() または getCacheDir()

外部ストレージからは getExternalFilesDir() または getExternalCacheDir()
内部ストレージには不要

Android 4.4(API レベル 19)以降を搭載するデバイスでアプリを使用する場合、外部ストレージには不要
× はい
メディア 共有可能なメディア ファイル(画像、音声ファイル、動画) MediaStore API Android 11(API レベル 30)以降で他のアプリのファイルにアクセスする場合、READ_EXTERNAL_STORAGE

Android 10(API レベル 29)で他のアプリのファイルにアクセスする場合、READ_EXTERNAL_STORAGE または WRITE_EXTERNAL_STORAGE

Android 9(API レベル 28)以前では、すべてのファイルで権限が必要
可能(ただし、他のアプリでは READ_EXTERNAL_STORAGE 権限が必要) ×
ドキュメントと他のファイル ダウンロードしたファイルを含めた、共有可能なその他の種類のコンテンツ ストレージ アクセス フレームワーク なし 可能(システムのファイル選択ツールを使用) ×
アプリ設定 Key-Value ペア Jetpack Preferences ライブラリ なし × はい
データベース 構造化データ Room 永続ライブラリ なし × はい

選択するソリューションは、次のようなニーズによって異なります。

データに必要な容量
内部ストレージのアプリ固有データ用のスペースは限られています。大量のデータを保存する必要がある場合は、他の種類のストレージを使用します。
データアクセスの信頼性
アプリの起動時など、アプリの基本機能に特定のデータが必要な場合は、内部ストレージのディレクトリまたはデータベースに保存します。外部ストレージに保存されているアプリ固有のファイルは、外部ストレージの物理デバイスをユーザーが取り外すことができるため、常にアクセスできるわけではありません。
保存する必要があるデータの種類
お客様のアプリにとってだけ意味のあるデータには、アプリ固有のストレージを使用します。共有可能なメディア コンテンツには、他のアプリがコンテンツにアクセスできるように共有ストレージを使用します。構造化データには、設定(Key-Value データの場合)またはデータベース(2 列以上のデータの場合)を使用します。
データを非公開にする必要性
他のアプリからアクセスできてはいけない機密データを保存する場合は、内部ストレージ、設定、またはデータベースを使用します。内部ストレージには、データがユーザーに表示されないというメリットもあります。

保存場所の種類

Android には、内部ストレージと外部ストレージという、2 種類の物理的な保存場所があります。ほとんどのデバイスで、内部ストレージの容量は外部ストレージよりも少なくなっています。ただし、内部ストレージは常にすべてのデバイスで利用できるため、アプリにとって重要なデータを保存する場所としては、より信頼性が高い場所です。

SD カードなどのリムーバブル ボリュームは、外部ストレージの一部としてファイル システムの中に現れます。Android では、こういったデバイスを /sdcard のようなパスを使用して表します。

アプリ自体はデフォルトで内部ストレージに保存されます。ただし、APK のサイズが非常に大きい場合は、次のようにアプリのマニフェスト ファイルで設定を指定して、アプリを外部ストレージにインストールさせることができます。

<manifest ...
  android:installLocation="preferExternal">
  ...
</manifest>

外部ストレージに対する権限とアクセス

Android では、ストレージ関連の権限として READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGEMANAGE_EXTERNAL_STORAGE が定義されています。

以前のバージョンの Android では、外部ストレージ上のアプリ固有のディレクトリの外にあるファイルにアクセスするために、READ_EXTERNAL_STORAGE 権限を宣言する必要がありました。また、アプリ固有のディレクトリ外にあるファイルに書き込むには、WRITE_EXTERNAL_STORAGE 権限を宣言する必要がありました。

これより新しいバージョンの Android では、アプリのファイルへのアクセス権と書き込み権を判断するにあたって、ファイルの場所よりも用途を重視します。特に、Android 11(API レベル 30)以降をターゲットとするアプリの場合、WRITE_EXTERNAL_STORAGE 権限はアプリのストレージへのアクセスに影響しません。このような用途に基づいたストレージ モデルでは、デバイスのファイル システムにある、アプリが実際に使用する領域のみにアクセスできるため、ユーザーのプライバシーが向上します。

Android 11 では、アプリ固有のディレクトリと MediaStore の外にあるファイルへの書き込みアクセスを実現する MANAGE_EXTERNAL_STORAGE 権限が導入されています。この権限の詳細と、ほとんどのアプリがユースケースを実現するためにこの権限を宣言する必要がない理由については、ストレージ デバイスのすべてのファイルを管理する方法に関するガイドをご覧ください。

対象範囲別ストレージ

ユーザーがファイルをきめ細かく管理して整理できるように、Android 10(API レベル 29)以降をターゲットとするアプリには、外部ストレージに対する限定的なアクセス権がデフォルトで付与されます(そのようなストレージを対象範囲別ストレージと呼びます)。このようなアプリでアクセスできるのは、外部ストレージにあるアプリ固有のディレクトリと、そのアプリが作成した特定の種類のメディアだけです。

アプリ固有のディレクトリの外にあり、MediaStore API でアクセスできるディレクトリの外にあるファイルへのアクセス権を必要とする場合を除き、対象範囲別ストレージを使用してください。アプリ固有のファイルを外部ストレージに保存する場合は、外部ストレージのアプリ固有のディレクトリに配置することで、対象範囲別ストレージの導入が容易になります。このようにして、対象範囲別ストレージが有効なとき、アプリでアプリ固有のファイルへのアクセス権を管理します。

アプリを対象範囲別ストレージに対応させるには、ストレージのユースケースとおすすめの方法に関するガイドをご覧ください。アプリの別のユースケースに対象範囲別ストレージを適用できない場合は、機能リクエストを提出してください。対象範囲別ストレージの使用を一時的にオプトアウトできます。

デバイス上のファイルを表示する

デバイスに保存されているファイルを表示するには、Android Studio の Device File Explorer を使用します。

参考情報

データ ストレージの詳細については、次のリソースをご覧ください。

動画