【Android】 メディアの権限やアクセス方法について

## はじめに
Android側のメディア周りはOSアップデートごとに変更が入って対応が大変なイメージがあります。
最近で一番影響があったのはOS13のアップデートですかね。
OS13以上と未満でメディア領域にアクセスするための権限が異なり、対応していないと写真や動画をアプリに持って来れないといこともあったかもしれません。

今回はメディア領域の権限・アクセス方法について整理していこうと思います。

## 写真や動画はどこに保存されるのか
そもそもの疑問ですが、カメラアプリ等で撮影した写真や動画はどこに保存されるのか気になり調べてみました。
Androidのストレージの仕様は大きく2つに分かれてそうで、写真や動画は「共有ストレージ」に保存されているようです。

| ストレージ種別 | 内容 |
| - | - |
| アプリ固有のストレージ | ・アプリ専用のファイルを保存する場所<br>・他アプリからはアクセスできない |
| 共有ストレージ | ・カメラで撮った写真や動画、スクリーンショットなど、共有可能なメディア ファイルが保存される場所<br>・他アプリと共有することが可能<br>・アプリを削除してもファイルは消えない |

## アクセスに必要な権限まわり
上述の通り、写真や動画等のメディア系のファイルは共有ストレージに保存されることになります。
ただ、「**共有**ストレージ」とありますが、無条件にアクセスできる場所ではありません。
（インストールしたアプリが勝手に写真とか動画を取得していたら怖いですもんね）

この領域にアクセスする場合は、別途ユーザーから権限を取得する必要があります。
冒頭でも触れましたが、必要になる権限がOSごとに変わるので面倒です。
さらに、OS14以上では「写真や動画への部分的なアクセス」が追加されたため、OS14以上はその考慮・対応も必要になります。

| Androidバージョン | 権限 | 説明 |
|------------------|------|------|
| **Android 9（APIレベル28）以前** | `READ_EXTERNAL_STORAGE` | 他アプリが保存したファイルの読み込みに必要 |
| | `WRITE_EXTERNAL_STORAGE` | ファイルの書き込みに必要 |
| **Android 10（APIレベル29）** | `READ_EXTERNAL_STORAGE` | 他アプリが保存したファイルの読み込みに必要 |
| | `WRITE_EXTERNAL_STORAGE` | 対象範囲別ストレージを無効にした場合ファイルの書き込みに必要<br>対象範囲別ストレージが有効の場合は不要な権限 |
| **Android 11 ~ 12（APIレベル30 ~ 32）** | `READ_EXTERNAL_STORAGE` | 他アプリが保存したファイルの読み込みに必要 |
| **Android 13（APIレベル33）** | `READ_MEDIA_IMAGES` | 他アプリが保存した画像や写真の読み込みに必要<br>OS13で追加 |
| | `READ_MEDIA_VIDEO` | 他アプリが保存した動画の読み込みに必要<br>OS13で追加 |
| | `READ_MEDIA_AUDIO` | 他アプリが保存した音声ファイルの読み込みに必要<br>OS13で追加 |
| **Android 14（APIレベル33）** | `READ_MEDIA_IMAGES` | 他アプリが保存した画像や写真の読み込みに必要 |
| | `READ_MEDIA_VIDEO` | 他アプリが保存した動画の読み込みに必要 |
| | `READ_MEDIA_AUDIO` | 他アプリが保存した音声ファイルの読み込みに必要 |
| | `READ_MEDIA_VISUAL_USER_SELECTED` | 写真や動画への部分的なアクセス権を機能させるために必要<br>OS14で追加 |

## アクセス方法
[Androidデベロッパーガイド](https://developer.android.com/training/data-storage/shared/media?hl=ja&_gl=1*gllrd1*_up*MQ..*_ga*MTYxNjUzMDAzNC4xNzIzODYwNzA2*_ga_6HH9YJMN9M*MTcyMzg2NDgwMC4yLjAuMTcyMzg2NDgwMC4wLjAuMA..)では、アクセス方法として写真選択ツールとMedia Storeが推奨されていました。

| アクセス方法 | メリット | デメリット |
|--------------|----------|------------|
| **Media Store** | ・OSの制限なし<br>・UIを自作するため、UIを調整できる | ・権限が必要<br>・UIを自作する必要がある |
| **写真選択ツール(Photo Picker)** | ・権限が不要<br>・提供されるUIを使うため、UIを自作する必要がない | ・OS制限あり（OS11以上の端末で使用可能）<br>・UIが提供されているものになるため、調整ができない |

Android OS13で導入された写真選択ツール(Photo Picker)を使えば、権限まわりを気にせずに手軽にメディアのアクセス機能を実装できそうです。
ただ、UIはカスタマイズ出来なさそう・OS11以上で使用可能 といった制限もあるため、
その辺の考慮し、Media StoreとPhoto Pickerのどっちを使えばいいかは検討が必要になりそうです。

Media Storeを使う場合はメディア権限が必要になるため、メディア権限の適切なコントロールやAndroid側の権限仕様変更等の動向に注意しておく必要がありそうです。

## おわりに
メディア周りの権限やアクセス方法についてまとめてみました。
直近でメディア周りは変更が入ることが多く、面倒な部分だなと感じており、今後も新OS発表時には注視していかなきゃなと思っています。
Photo Pickerを使えば権限の考慮は不要になりそうですが、OS11以上でしか使えないとのことなので、、なかなか導入しにくそうですね。

この記事が少しでも参考になれば幸いです！

## 参考
- [データ ストレージとファイル ストレージの概要  |  Android Developers](https://developer.android.com/training/data-storage?hl=ja)
- [Access media files from shared storage  |  Android Developers](https://developer.android.com/training/data-storage/shared/media?_gl=1*h4suua*_up*MQ)
- [Android: Android 10 からの対象範囲別ストレージ (Scoped Storage) とメディアファイルアクセスのまとめ - Qiita](https://qiita.com/irgaly/items/0ce450dd77bd54fb560a)
- [[DroidKaigi 2021] メディアアクセス古今東西 / Now and Future of Media Access](https://speakerdeck.com/e10dokup/now-and-future-of-media-access?slide=15)
- [Android 対象範囲別ストレージの導入と外部ストレージにおけるファイルアクセス制限](https://zenn.dev/kaneko_s/articles/4e4a7947895d34)
- [動作の変更点: Android 13 以上をターゲットとするアプリ  |  Android Developers](https://developer.android.com/about/versions/13/behavior-changes-13?hl=ja)