写真と動画への部分的なアクセス権を付与する

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_IMAGESREAD_MEDIA_VIDEO だけです。READ_MEDIA_VISUAL_USER_SELECTED を宣言すると、追加の写真と動画の選択を求める手動の再リクエストをアプリがサポートしていることが、権限コントローラに認識されます。

ユーザーに複数のシステム ランタイム ダイアログ ボックスが表示されないようにするには、1 回のオペレーションで READ_MEDIA_VISUAL_USER_SELECTEDACCESS_MEDIA_LOCATION、「読み取りメディア」権限(READ_MEDIA_IMAGESREAD_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 の権限

次のような状況を考えてみましょう。

  1. アプリは Android 13 を搭載したデバイスにインストールされています。
  2. ユーザーがアプリに READ_MEDIA_IMAGES 権限と READ_MEDIA_VIDEO 権限を付与しています。
  3. アプリがインストールされている状態で、デバイスが Android 14 にアップグレードされます。

この場合、アプリは引き続きそのユーザーの写真と動画への完全アクセス権を持ちます。また、アプリに付与されている READ_MEDIA_IMAGES 権限と READ_MEDIA_VIDEO 権限も自動的に保持されます。

Android 12 以前の権限

次のような状況を考えてみましょう。

  1. アプリは Android 13 を搭載したデバイスにインストールされています。
  2. ユーザーがアプリに READ_EXTERNAL_STORAGE 権限または WRITE_EXTERNAL_STORAGE 権限を付与しています。
  3. アプリがインストールされている状態で、デバイスが Android 14 にアップグレードされます。

この場合、アプリは引き続きそのユーザーの写真と動画への完全アクセス権を持ちます。また、READ_MEDIA_IMAGES 権限と READ_MEDIA_VIDEO 権限もアプリに自動的に付与されます。

ベスト プラクティス

このセクションでは、READ_MEDIA_VISUAL_USER_SELECTED 権限を使用する際のベスト プラクティスについて説明します。

バックグラウンドでのメディア処理には基本的に新しい権限が必要

バックグラウンドでメディアを圧縮またはアップロードするなど、アプリでメディア処理を行う場合、READ_MEDIA_IMAGESREAD_MEDIA_VIDEO の権限の状態は最終的に再び拒否されることに注意してください。そのため、READ_MEDIA_VISUAL_USER_SELECTED のサポートを追加することを強くおすすめします。または、InputStream を開くか ContentResolver を使用してクエリを実行し、アプリが特定の写真や動画にアクセスできるかどうかを確認する必要があります。

権限の状態を永続的に保存しない

SharedPreferencesDataStore を含め、権限の状態を永続的に保存しないでください。保存された状態は、実際の状態と同期していない可能性があります。権限の状態は、権限のリセット後、アプリの休止状態の後、アプリの設定でユーザーが開始した変更の後、またはアプリがバックグラウンドになったときに変更される可能性があります。代わりに、ContextCompat.checkSelfPermission() を使用してストレージへの権限を確認してください。

写真と動画への完全アクセス権を持っていることを前提としない

Android 14 で導入された変更により、アプリがデバイスのフォト ライブラリに部分的にしかアクセスできない場合があります。ContentResolver を使用してクエリが行われたときにアプリが MediaStore データをキャッシュに保存していた場合、キャッシュが最新ではない可能性があります。

  • 保存されたキャッシュに依存するのではなく、常に ContentResolver を使用して MediaStore をクエリしてください。
  • アプリがフォアグラウンドにある間、結果をメモリに保持してください。

URI アクセスを一時的なものとして扱う

ユーザーがシステム権限ダイアログで [写真と動画を選択] を選択すると、選択した写真と動画へのアプリのアクセス権が最終的に期限切れになります。アプリは、認証局にかかわらず、Uri にアクセスできないケースを常に処理する必要があります。