データを保存するストレージ領域が目的・用途によって区分されてセキュリティー的に厳しくなりました。
対象範囲別外部ストレージ
Scoped Storage
と言われる「対象範囲別外部ストレージ」がAPI29で導入されました。API30では更に厳しくに適応されるようになっているようです。
これからリリースするアプリであれば、アプリのみで完結していればむしろ簡単になった気もします。
ややこしいのは requestLegacyExternalStorage の扱いでしょうか
Android 10(API レベル 29)をターゲットとするアプリであれば、引き続き requestLegacyExternalStorage 属性をリクエストできます。アプリでこのフラグを指定すると、異なるディレクトリや種類の異なるメディア ファイルへのアクセス権の付与など、対象範囲別ストレージに関連する変更を一時的に無効にできます。
Android11になって、
Android 11 をターゲットとするようにアプリを更新すると、requestLegacyExternalStorage フラグは無視されます。
Ref: Android 11 でのストレージに関する更新
requestLegacyExternalStorage はもう使えないということです。テスト用途とかそういうことでしょう
ファイルシステム
アプリデータの保存方法として大まかに次のストレージが用意されています。
今まで内部ストレージと外部ストレージはありましたが、外部ストレージが目的に応じて分けられ、アクセス方法と許可が別々に設定されています。
Ref: データ ストレージとファイル ストレージの概要
(ストレージ名がドキュメントで微妙に異なります)
アプリ固有
アプリで使う内部ストレージ領域は限られているため、画像や動画などの大容量のファイルを保存利用する場合は外部ストレージを使う必要があり、アプリ固有の外部ディレクトリが用意されています。
- 設定データなど外部からのアクセスを望まないものはアプリ固有の内部ストレージに保存
- 他のアプリも適切な権限を持っていれば外部ストレージにアクセスできる
- アプリ自身が使う場合にはPermissionは不要
- このストレージ領域はアプリが削除されるとファイルも削除される
内部ストレージ:
getFilesDir()または getCacheDir()を使って
以下にアクセス
1 |
/data/data/[package_name]/files/ |
外部ストレージ:
getExternalFilesDir() または getExternalCacheDir()を使って
以下のようなPathにアクセスする(実装は端末依存)
1 |
/storage/emulated/0/Android/data/[package_name]/files/ |
メディア
共有可能なストレージで写真、動画やミュージックなどのメディアを保存できる領域です。
- MediaStore APIを使ってアクセスし、他のアプリが作成したメディアには読み出しでアクセスできる
- READ_EXTERNAL_STORAGE のPermissionが必要
- アプリが削除されてもファイルは残っている
● 画像:(写真とスクリーンショットを含む)
DICM/、Picture/ ディレクトリに格納されている
テーブルは MediaStore.Images
● 動画:
DCIM/、Movies/、Pictures/ ディレクトリに格納
テーブルは MediaStore.Video
● オーディオ:
オーディオファイルは Alarms/、Audiobooks/、Music/、Notifications/、Podcasts/、Ringtones/ ディレクトリに格納
オーディオ プレイリストは Music/ ディレクトリまたは Movies/ ディレクトリに格納
テーブルは MediaStore.Audio
ダウンロード
ドキュメントやダウンロードしたファイルで共有可能な領域
SAF(ストレージ アクセス フレームワーク)を使ってアクセスできPermissionは必要なく、他のアプリからアクセス可能
アプリが削除されてもファイルは残っている
●ダウンロード:
ダウンロードされたファイルは Download/ ディレクトリに格納
テーブルはMediaStore.Downloads(Android 10以上のみ)
上記以外にも、
アプリ設定:
Key-Value ペアのデータを保存用で SharedPreferences APIを使い、
非公開にすることも共有することも可能
データベース:
SQLiteの構造化データを非公開のデータベースに保存
References:
データ ストレージとファイル ストレージの概要
対象範囲別外部ストレージ アクセスを管理する
Android ストレージのユースケースとおすすめの方法
Android 11 におけるプライバシー
アプリ固有のファイルにアクセスする
共有ストレージからメディア ファイルにアクセスする