Android 13の変更により、新しいメディアファイルへのアクセス権が追加されました。
Android developerで紹介された資料は、きめ細かいメディア権限です。
1. きめ細かいメディア権限
この変更は、Android 13以降(API 33 or higher)をターゲットとするアプリを対象としています。
主な内容は、メディアファイル全体にアクセスできる「READ_EXTERNAL_STORAGE」権限が使用されなくなり、3つの権限に分けられました。
- READ_MEDIA_IMAGES: 画像、写真ファイルへのアクセス権
- READ_MEDIA_VIDEO: ビデオファイルへのアクセス権
- READ_MEDIA_AUDIO: オーディオファイルへのアクセス権
したがって、ターゲットAPIが33以上のアプリは READ_EXTERNAL_STORAGE
を使用せず、必要に応じて3つの権限をユーザーに要求する必要があります。
2. Android 13でAPI 32以下アプリの動作方法
新しいメディアファイルの権限への変更は、ターゲットAPI 33以降のアプリに適用されると述べました。しかし、API 32以下のアプリも3つの権限を持ち、実際にこの権限でファイルにアクセスすることになります。
もう一度説明すると、システムはAPI 32以前のアプリが READ_EXTERNAL_STORAGE
権限を持っているときに3つの権限をすべて与えます。
アプリが「READ_EXTERNAL_STORAGE」権限をユーザーに要求して権限を受け取ると、システムは3つの権限をすべてアプリに付与します。
新しいファイル権限はAPI 33で公開されているため、API 32以前のアプリはこの権限の存在を知らないため、直接追加できません。 そのため、システムが自動的に追加しています。
実際にAPI 32以下のアプリで以下のコードで READ_EXTERNAL_STORAGE
権限をリクエストすると、
requestPermissions(
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
REQUEST_CODE)
次のように3つの権限についてすべて要求します。ポップアップで Allow
ボタンを押すと、3つの権限がすべて付与されます。
App情報のパーミッション設定画面では、以下のように2つの項目が表示されます。 (ビデオと画像の権限が1つのアイテムにまとめられる)
権限が付与されたときにadbコマンドで権限情報を確認すると、以下のように4つのパーミッションが付与されたことがわかります。 (READ_EXTERNAL_STORAGEにはファイルアクセス権はなくなりますが、単に下位互換性を維持するために追加されました)
$ adb shell dumpsys package com.example.myapplication
Packages:
Package [com.example.myapplication] (68288f6):
versionCode=1 minSdk=23 targetSdk=31
...
runtime permissions:
android.permission.POST_NOTIFICATIONS: granted=false
android.permission.READ_EXTERNAL_STORAGE: granted=true
android.permission.READ_MEDIA_IMAGES: granted=true
android.permission.READ_MEDIA_AUDIO: granted=true
android.permission.READ_MEDIA_VIDEO: granted=true
もう一つ知っておくべきことは、API 32以下アプリの場合、ユーザーがApp情報のパーミッション画面で「Music and audio」権限を回収しても「Photo and video」および「READ_EXTERNAL_STORAGE」権限がすべて回収されます。
これらのアプリは READ_EXTERNAL_STORAGE
権限のみを持っているため、細分化されたパーミッションの中で一つだけ付与ができなかったときに対処ができないからです。そのため、システムはすべてのパーミッションを回収します。
一方、API 33以上のアプリは3つのパーミッションに対して別々に権限を要求しており、それぞれのパーミッションに対して例外処理がされているため、別々に権限を付与、回収できます。
3. Android 13でAPI 33以降のアプリがどのように機能するか
API 33以降のアプリが「READ_EXTERNAL_STORAGE」権限をアプリに宣言し、次のコードでユーザーに権限を要求してもポップアップは発生しません。
READ_EXTERNAL_STORAGE
権限はdeprecatedされ、使用されていないためです。
requestPermissions(
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
REQUEST_CODE)
また、API 33以降のアプリは新しいメディア権限をすべて知っているため、 READ_EXTERNAL_STORAGE
権限をアプリに宣言してもシステムは自動的に3つの権限を追加しません。
必要に応じて、アプリは以下のように直接権限を宣言する必要があります。
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
そして、権限を要求するときは、以下のように3つのパーミッションを一度に要求したり、必要に応じて別に要求することができます。
リクエストポップアップは Music and audio
と Photo and video
エントリに対して 2 回発生します。
requestPermissions(
arrayOf(Manifest.permission.READ_MEDIA_AUDIO,
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.READ_MEDIA_IMAGES),
REQUEST_CODE)
最後に、App情報のPermissions設定画面でユーザーが一部のパーミッションを回収しても、他のメディアファイル権限は回収されません。アプリは回収されたパーミッションを確認することができ、必要に応じてユーザーにパーミッションが必要だと説明し、設定から変更を依頼することができます。
4. Android 13にアップグレードすると、既存のアプリの動作方法
デバイスがAndroid 13にアップグレードすると、API 32以前のアプリはどうなりますか?
「READ_EXTERNAL_STORAGE」権限を持つAPI 32以下のアプリには、3つの新しいメディア権限がすべて付与されます。 したがって、Android 13にアップグレードした後に再度リクエストする必要はありません。
Related Posts
- Android - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - adbコマンドでActivity実行
- アンドロイド - MediaStoreにメディアファイルを保存する方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android11 - Storage(ストレージ)の変更まとめ
- Jetpack Compose - RowとColumn
- Android 13 - 細かいメディアファイルの権限
- Android 13でNotification権限をリクエスト、通知を表示する
- エラー解決:android gradle plugin requires java 11 to run. you are currently using java 1.8.
- Query method parameters should either be a type that can be converted into a database column or a List
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - adbコマンドで特定のパッケージのプロセスの終了
- Android - adb push、pullでファイルのコピー、ダウンロード
- Android - adbコマンドでsettings value確認、変更、
- Android 12 - IntentFilterのexported明示的な宣言
- Android - adb logcatコマンドでログ出力
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - Foreground Service実行
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - アプリの権限を確認(Permission check)
- Android - adbで実行中のプロセス、スレッドリスト及びメモリ情報の確認
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Cleartext HTTP ... not permitted例外解決方法
- Androidのビルドエラー - Calls to Java default methods are prohibited in JVM target 1.6
- アンドロイド - Assetsでファイルを読み取る方法
- アンドロイドのさまざまなNotification種類と実装方法
- アンドロイド - INSTALL_FAILED_TEST_ONLYエラー解決方法
- Android EspressoのCustom Matcher実装方法
- Android Espressoを使用してUIをテストする方法(3)
- アンドロイド - CTS hostsideをgradleで構築する方法
- Androidのアプリのデータフォルダーのパスと内部/外部ストレージ説明
- アンドロイド - 最初のApp作成
- Androidをインストールする方法(Windows)