[Android] データ保存、対象範囲別外部ストレージ

データを保存するストレージ領域が目的・用途によって区分されてセキュリティー的に厳しくなりました。




対象範囲別外部ストレージ

 Scoped Storage

と言われる「対象範囲別外部ストレージ」がAPI29で導入されました。API30では更に厳しくに適応されるようになっているようです。

これからリリースするアプリであれば、アプリのみで完結していればむしろ簡単になった気もします。

ややこしいのは requestLegacyExternalStorage の扱いでしょうか

Android 10(API レベル 29)をターゲットとするアプリであれば、引き続き requestLegacyExternalStorage 属性をリクエストできます。アプリでこのフラグを指定すると、異なるディレクトリや種類の異なるメディア ファイルへのアクセス権の付与など、対象範囲別ストレージに関連する変更を一時的に無効にできます。

Android11になって、

Android 11 をターゲットとするようにアプリを更新すると、requestLegacyExternalStorage フラグは無視されます。

Ref: Android 11 でのストレージに関する更新
requestLegacyExternalStorage はもう使えないということです。テスト用途とかそういうことでしょう
 

 

ファイルシステム

 

アプリデータの保存方法として大まかに次のストレージが用意されています。
今まで内部ストレージと外部ストレージはありましたが、外部ストレージが目的に応じて分けられ、アクセス方法と許可が別々に設定されています。

1x1.trans - [Android] データ保存、対象範囲別外部ストレージ


Ref: データ ストレージとファイル ストレージの概要
(ストレージ名がドキュメントで微妙に異なります)
 

アプリ固有

 

アプリで使う内部ストレージ領域は限られているため、画像や動画などの大容量のファイルを保存利用する場合は外部ストレージを使う必要があり、アプリ固有の外部ディレクトリが用意されています。

  • 設定データなど外部からのアクセスを望まないものはアプリ固有の内部ストレージに保存
  • 他のアプリも適切な権限を持っていれば外部ストレージにアクセスできる
  • アプリ自身が使う場合にはPermissionは不要
  • このストレージ領域はアプリが削除されるとファイルも削除される

内部ストレージ:

getFilesDir()または getCacheDir()を使って
以下にアクセス

 

external storage 00 100x100 - [Android] データ保存、対象範囲別外部ストレージ
アプリ固有の内部ストレージにファイルを保存する方法について見てみましょう。

 
外部ストレージ:
getExternalFilesDir() または getExternalCacheDir()を使って
以下のようなPathにアクセスする(実装は端末依存)

 

cat29 00 100x100 - [Android] データ保存、対象範囲別外部ストレージ
アプリ固有の外部ストレージに画像ファイルを保存する方法について見てみましょう。

 

 

メディア

 

共有可能なストレージで写真、動画やミュージックなどのメディアを保存できる領域です。

  • MediaStore APIを使ってアクセスし、他のアプリが作成したメディアには読み出しでアクセスできる
  • READ_EXTERNAL_STORAGE のPermissionが必要
  • アプリが削除されてもファイルは残っている

画像:(写真とスクリーンショットを含む)
DICM/Picture/ ディレクトリに格納されている
テーブルは MediaStore.Images
 

mediastore save 00 100x100 - [Android] データ保存、対象範囲別外部ストレージ
パブリックな共有ストレージのMediaStoreに画像を保存する方法について見てみましょう。

 
動画:
DCIM/Movies/Pictures/ ディレクトリに格納
テーブルは MediaStore.Video

オーディオ:
オーディオファイルは Alarms/Audiobooks/Music/Notifications/Podcasts/Ringtones/ ディレクトリに格納
オーディオ プレイリストは Music/ ディレクトリまたは Movies/ ディレクトリに格納
テーブルは MediaStore.Audio
 

cat30 00 100x100 - [Android] データ保存、対象範囲別外部ストレージ
スマホ内で共有されるMediaStorageにアクセスして画像や音楽ファイルをContentProviderを使って探してみます。

 

 

ダウンロード

 

ドキュメントやダウンロードしたファイルで共有可能な領域

SAF(ストレージ アクセス フレームワーク)を使ってアクセスできPermissionは必要なく、他のアプリからアクセス可能

アプリが削除されてもファイルは残っている

ダウンロード:
ダウンロードされたファイルは Download/ ディレクトリに格納
テーブルはMediaStore.Downloads(Android 10以上のみ)
 

cat33 00 100x100 - [Android] データ保存、対象範囲別外部ストレージ
デフォルトでAndroidにインストールされているギャラリーあるいはフォトから画像を取得するにはSAF(Storage Access Fra...

 
上記以外にも、

アプリ設定:
Key-Value ペアのデータを保存用で SharedPreferences APIを使い、
非公開にすることも共有することも可能

cat28 00 100x100 - [Android] データ保存、対象範囲別外部ストレージ
アプリで使うちょっとしたデータを保存したい場合に SharedPreferences を使うと簡単にできます。但し、データが多くなるような場...

データベース:
SQLiteの構造化データを非公開のデータベースに保存

sqlite 00 3 100x100 - [Android] データ保存、対象範囲別外部ストレージ
大量データの読み書き、さらに検索したい場合はデータベースが便利で、AndroidではSQLiteを使います。ここでは簡単な例を試してみます。...

References:
データ ストレージとファイル ストレージの概要
対象範囲別外部ストレージ アクセスを管理する
Android ストレージのユースケースとおすすめの方法
Android 11 におけるプライバシー
アプリ固有のファイルにアクセスする
共有ストレージからメディア ファイルにアクセスする

シェアする

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

フォローする