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

external storage 01 - [Android] データ保存、対象範囲別外部ストレージ
データを保存するストレージ領域が目的・用途によって区分されてセキュリティー的に厳しくなりました。



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

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

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

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

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

Android11になって、

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

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

 

ファイルシステム

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

scoped storage 01 - [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にインストールされているギャラリーあるいはフォトには、撮った写真や画像が保存されています。そこから画像を取得す...

 
上記以外にも、

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

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

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

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

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

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから mailフォーム

ブックマークしておくと便利です このエントリーをはてなブックマークに追加

 

アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう。

オンラインスクールは色々ありますが、以下の3つはAndroidが学習できる老舗スクールです。


TECH ACADEMY
Androidアプリコース


こういうものではアプリ作れないと言う意見もありますが、それは結局本人のやる気があるかないかです。やる気があっても独学では突破しにくいところは教えてもらうのが一番早い。


侍エンジニア塾
侍エンジニア塾 無料体験レッスン


とても簡単なことなのに本やネットの画像だけでは分かりにくいことはあります。実際に質問してピンポイントで教えてもらうと、なんだそんなこと、と言うのがけっこうあります。


CodeCamp
~約8,000名の受講生と80社以上の導入実績~
現役エンジニアのオンライン家庭教師CodeCamp




直接(ネットで)誰か分かる人に聞いた方が早く解決して、上達も早いと思います。




シェアする

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

フォローする