Android の外部ストレージ関係のパーミッションの扱いって、API レベルでいろいろと変わってわかりにくいので、まとめてみました。何かのご参考にしてください。
ただ、いろいろとドキュメントを読んではみたものの、理解不足から間違っている可能性もあります。その点を踏まえてご覧になる際は自己責任でお願いします。ということで、最終的にはご自分で公式ドキュメントを確認することをお勧めします。
なお、下記表で
- READ は READ_EXTERNAL_STORAGE のこと
- WRITE は WRITE_EXTERNAL_STORAGE のこと
です(ともに dangerous パーミッションです)。
外部ストレージの READ, WRITE を行う際に必要となる権限について
ターゲット | manifest 宣言, READ | manifest 宣言, WRITE | Runtime Permission 処理 | 備考 |
---|---|---|---|---|
API 3 ( Android 1.5 ) 以前 |
- | - | - | 常に許可される |
API 4 ( Android 1.6 ) ~ |
- | 必要 | - | WRITE 導入 |
API 19 ( Android 4.4, Kitkat) ~ |
必要、一部不要 ※1 | 同左 | - | READ が必要になる |
API 23 ( Android 6 ) ~ |
同上 | 同上 | 必要 | Runtime Permission が導入 |
API 29 ( Android 10, Q ) ~ |
必要、一部不要 ※2 | 同左 | たぶん必要 | 対象範囲別ストレージ導入 |
※1 一部不要:特定の領域へのアクセスは宣言不要です(『アプリ固有のディレクトリ』と呼ばれており、具体的には getExternalFilesDir(), getExternalCacheDir() で取得されるディレクトリになります)
※2 一部不要:対象範囲別ストレージになり、アプリ固有のディレクトリには、そのアプリ以外のアプリはアクセスできなくなります
対象範囲別ストレージはまだ試してないので、ちょっと自信ありませんが、たぶんこんな感じになると思います。
ご参考までに。