Android 14 デバイスでアプリを操作するユーザーは、アプリが Android 13(API レベル 33)で導入されたビジュアル メディアの権限(READ_MEDIA_IMAGES
または READ_MEDIA_VIDEO
)をリクエストしたときに、ビジュアル メディア ライブラリ(写真と動画)への部分的なアクセス権を付与できるようになりました。
新しいダイアログには次のオプションがあります。
- 写真と動画を選択: Android 14 の新機能。アプリでの使用を許可する特定の写真と動画を選択します。
- すべて許可: デバイス上のすべての写真と動画のライブラリへの完全なアクセスを許可します。
- 許可しない: すべてのアクセスを拒否します。
ユーザーが [写真と動画を選択] を選択して、その後でアプリが READ_MEDIA_IMAGES
または READ_MEDIA_VIDEO
を再度リクエストすると、別のダイアログが表示され、ユーザーは追加の写真と動画へのアクセス権を付与できます。
この新しい変更をアプリがサポートできるよう、新しい権限 READ_MEDIA_VISUAL_USER_SELECTED
が導入されています。
新しい権限を宣言することの影響
READ_MEDIA_VISUAL_USER_SELECTED
権限を宣言した場合、ユーザーがシステム権限ダイアログで [写真と動画を選択] を選択すると、次のように動作します。
READ_MEDIA_IMAGES
権限とREAD_MEDIA_VIDEO
権限は両方とも拒否されます。READ_MEDIA_VISUAL_USER_SELECTED
権限が付与され、ユーザーの写真と動画に部分的かつ一時的にアクセスできるようになります。- アプリが他の写真や動画にアクセスする必要がある場合は、
READ_MEDIA_IMAGES
権限とREAD_MEDIA_VIDEO
権限のいずれか(または両方)を手動で再度リクエストする必要があります。
ユーザーの写真と動画のライブラリにアクセスするために必要なその他の権限は、READ_MEDIA_IMAGES
と READ_MEDIA_VIDEO
だけです。READ_MEDIA_VISUAL_USER_SELECTED
を宣言すると、追加の写真と動画の選択を求める手動の再リクエストをアプリがサポートしていることが、権限コントローラに認識されます。
ユーザーに複数のシステム ランタイム ダイアログ ボックスが表示されないようにするには、1 回のオペレーションで READ_MEDIA_VISUAL_USER_SELECTED
、ACCESS_MEDIA_LOCATION
、「読み取りメディア」権限(READ_MEDIA_IMAGES
と READ_MEDIA_VIDEO
のいずれかまたは両方)をリクエストします。
新しい権限を宣言しないことの影響
READ_MEDIA_VISUAL_USER_SELECTED
権限を宣言しないと、次のように動作します。
READ_MEDIA_IMAGES
権限とREAD_MEDIA_VIDEO
権限は、アプリ セッション中に付与され、ユーザーが選択した写真と動画に対する一時的な権限およびアクセス権が提供されます。アプリがバックグラウンドに移動した場合や、ユーザーが積極的にアプリを強制終了した場合、システムは最終的にこれらの権限を拒否します。この動作は、他の 1 回だけのアクセス許可と同様です。- 後からアプリで追加の写真と動画にアクセスする必要が生じた場合は、
READ_MEDIA_IMAGES
権限またはREAD_MEDIA_VIDEO
権限をもう一度手動でリクエストする必要があります。システムは最初の権限リクエストと同じフローに従い、ユーザーは写真と動画を選択するよう求められます。
デバイスのアップグレード後も、写真と動画へのアクセスは保持される
以前のバージョンの Android から Android 14 にアップグレードするデバイスにアプリがインストールされている場合、システムではそのユーザーの写真と動画への完全アクセス権は維持され、アプリに一部の権限が自動的に付与されます。デバイスが Android 14 にアップグレードされる前にアプリに付与されている権限のセットによって、具体的な動作は異なります。
Android 13 の権限
次のような状況を考えてみましょう。
- アプリは Android 13 を搭載したデバイスにインストールされています。
- ユーザーがアプリに
READ_MEDIA_IMAGES
権限とREAD_MEDIA_VIDEO
権限を付与しています。 - アプリがインストールされている状態で、デバイスが Android 14 にアップグレードされます。
この場合、アプリは引き続きそのユーザーの写真と動画への完全アクセス権を持ちます。また、アプリに付与されている READ_MEDIA_IMAGES
権限と READ_MEDIA_VIDEO
権限も自動的に保持されます。
Android 12 以前の権限
次のような状況を考えてみましょう。
- アプリは Android 13 を搭載したデバイスにインストールされています。
- ユーザーがアプリに
READ_EXTERNAL_STORAGE
権限またはWRITE_EXTERNAL_STORAGE
権限を付与しています。 - アプリがインストールされている状態で、デバイスが Android 14 にアップグレードされます。
この場合、アプリは引き続きそのユーザーの写真と動画への完全アクセス権を持ちます。また、READ_MEDIA_IMAGES
権限と READ_MEDIA_VIDEO
権限もアプリに自動的に付与されます。
ベスト プラクティス
このセクションでは、READ_MEDIA_VISUAL_USER_SELECTED
権限を使用する際のベスト プラクティスについて説明します。
バックグラウンドでのメディア処理には基本的に新しい権限が必要
バックグラウンドでメディアを圧縮またはアップロードするなど、アプリでメディア処理を行う場合、READ_MEDIA_IMAGES
と READ_MEDIA_VIDEO
の権限の状態は最終的に再び拒否されることに注意してください。そのため、READ_MEDIA_VISUAL_USER_SELECTED
のサポートを追加することを強くおすすめします。または、InputStream
を開くか ContentResolver
を使用してクエリを実行し、アプリが特定の写真や動画にアクセスできるかどうかを確認する必要があります。
権限の状態を永続的に保存しない
SharedPreferences
や DataStore
を含め、権限の状態を永続的に保存しないでください。保存された状態は、実際の状態と同期していない可能性があります。権限の状態は、権限のリセット後、アプリの休止状態の後、アプリの設定でユーザーが開始した変更の後、またはアプリがバックグラウンドになったときに変更される可能性があります。代わりに、ContextCompat.checkSelfPermission()
を使用してストレージへの権限を確認してください。
写真と動画への完全アクセス権を持っていることを前提としない
Android 14 で導入された変更により、アプリがデバイスのフォト ライブラリに部分的にしかアクセスできない場合があります。ContentResolver
を使用してクエリが行われたときにアプリが MediaStore
データをキャッシュに保存していた場合、キャッシュが最新ではない可能性があります。
- 保存されたキャッシュに依存するのではなく、常に
ContentResolver
を使用してMediaStore
をクエリしてください。 - アプリがフォアグラウンドにある間、結果をメモリに保持してください。
URI アクセスを一時的なものとして扱う
ユーザーがシステム権限ダイアログで [写真と動画を選択] を選択すると、選択した写真と動画へのアプリのアクセス権が最終的に期限切れになります。アプリは、認証局にかかわらず、Uri
にアクセスできないケースを常に処理する必要があります。