Android 11 でのストレージに関する更新

Android 11 ではプラットフォームをさらに強化し、外部ストレージ上のアプリとユーザーのデータの保護を改善しています。この取り組みの一環として、対象範囲別ストレージへの移行を容易にする改善がプラットフォームに追加されています。

今回のプレビュー リリースでは、Google が Android Dev Summit で去年発表したように、メディアの raw ファイルパスへのオプトイン アクセス、メディアの一括編集操作、ストレージ アクセス フレームワークの UI の更新などの機能強化が行われています。

デベロッパー プレビューの今後のリリースでは、ファイル アクセスがさらに強化され、ファイル管理やフォト ギャラリーに関するポリシーの更新が行われる予定です。今後とも、Android の次期バージョンを方向づけるフィードバックをお寄せくださるようお願いいたします。Issue Tracker を使用してコメントを送信してください。

ご意見、ご感想をお待ちしております。こちらの簡単なアンケートにご協力ください。この機能をどのようにご利用かをお知らせいただければ幸いです。特に、この機能により影響を受けるユースケースについてお知らせください。

対象範囲別ストレージの適用

デベロッパーがテストに時間をかけられるように、Android 10(API レベル 29)をターゲットとするアプリであれば、引き続き requestLegacyExternalStorage 属性をリクエストできます。アプリでこのフラグを指定すると、異なるディレクトリや種類の異なるメディア ファイルへのアクセス権の付与など、対象範囲別ストレージに関連する変更を一時的に無効にできます。Android 11 をターゲットとするようにアプリを更新すると、requestLegacyExternalStorage フラグは無視されます。

Android 10 との互換性を維持する

Android 10 デバイスで稼働するアプリが対象範囲別ストレージを無効にする場合、アプリのマニフェスト ファイルで引き続き requestLegacyExternalStoragetrue に設定することが推奨されます。それにより、Android 10 を搭載するデバイスで引き続きアプリが想定どおりに動作できます。

対象範囲別ストレージを使用して表示できるディレクトリにデータを移行する

アプリが以前のストレージ モデルを使用していて、これまで Android 10 以下をターゲットにしていた場合、対象範囲別ストレージ モデルを有効にするとアプリからアクセスできなくなるディレクトリに、データを保存している可能性があります。Android 11 をターゲットとする前に、対象範囲別ストレージと互換性のあるディレクトリにデータを移行してください。ほとんどの場合、アプリ専用のディレクトリにデータを移行できます。

移行するデータがある場合、Android 11 をターゲットとするアプリの新しいバージョンにユーザーがアップグレードする際に、以前のストレージ モデルを保持することもできます。これにより、アプリがこれまでにデータを保存していたディレクトリ内のアプリデータに、ユーザーが引き続きアクセスできます。アップグレードに際して、以前のストレージ モデルを有効にするには、アプリのマニフェストで preserveLegacyExternalStorage 属性を true に設定してください。

注: ほとんどのアプリでは preserveLegacyExternalStorage を使用する必要はありません。このフラグは、対象範囲別ストレージと互換性のある場所にアプリデータを移行した後、アプリを更新するユーザーがデータへのアクセスを維持できるようにする状況でのみ使用するように設計されています。このフラグを使用すると、対象範囲別ストレージがアプリのユーザーにどのように影響を与えているかのテストが難しくなります。ユーザーがアプリを更新しても、アプリは以前のストレージ モデルを引き続き使用するからです。

preserveLegacyExternalStorage を使用する場合、以前のストレージ モデルはユーザーがアプリをアンインストールするまで、ずっと有効なままになります。Android 11 が稼働するデバイス上でユーザーがアプリをインストールまたは再インストールする場合は、preserveLegacyExternalStorage の値にかかわらず、アプリは対象範囲別ストレージ モデルを無効にできなくなります。

対象範囲別ストレージをテストする

アプリのターゲット SDK のバージョンとマニフェスト フラグの値にかかわらず、アプリ内で対象範囲別ストレージを有効にするには、以下のアプリの互換性フラグを有効にします。

対象範囲別ストレージを無効にして、以前のストレージ モデルを代わりに使用するには、両方のフラグの設定を解除してください。

デバイスのストレージを管理する

ファイル マネージャー アプリは Android 11 で稼働している場合、[すべてのファイルのアクセス] 権限があっても、他のアプリのキャッシュ ファイルを削除できなくなりました。代わりに、ファイル マネージャー アプリは以下の処理を行う必要があります。

  1. ACTION_MANAGE_STORAGE インテントのアクションを呼び出して空き容量を確認します。
  2. デバイスに十分な空き容量がない場合、キャッシュの削除に同意するようユーザーに求めます。そのために、ACTION_CLEAR_APP_CACHE インテントのアクションを呼び出します。

メディア ファイルへのアクセス

Android 11 では、ユーザーのプライバシーを維持しながらメディアにアクセスしやすくするために、以下の機能が追加されています。

一括操作を行う

デバイス間の一貫性を保ち、ユーザーの利便性を高めるため、Android 11 では MediaStore API に複数のメソッドを追加しています。これらのメソッドは、写真の編集をその場で行うなど、特定のメディア ファイルの変更を合理化したフローで行おうとするアプリに特に便利です。

追加されるメソッドは次のとおりです。

createWriteRequest()
メディア ファイルの指定のグループへの書き込みアクセス権をユーザーがアプリに付与するためのリクエスト。
createFavoriteRequest()
ユーザーが指定したメディア ファイルをデバイス上の「お気に入り」のメディアの一部としてマークするためのリクエスト。このファイルに読み取りアクセス権を持つアプリは、ユーザーがそのファイルを「お気に入り」としてマークしたことを確認できます。
createTrashRequest()
ユーザーが指定したメディア ファイルをデバイスのゴミ箱に入れるためのリクエスト。ゴミ箱内のアイテムは、システムが規定する期間後に完全に削除されます。
createDeleteRequest()
前もってゴミ箱に入れずに、ユーザーが指定したメディア ファイルを完全に削除するためのリクエスト。

これらのメソッドのいずれかを呼び出すと、システムは PendingIntent オブジェクトを作成します。アプリがこのインテントを呼び出すと、指定のメディア ファイルをアプリが更新または削除する同意を求めるダイアログがユーザーに表示されます。

raw パスを使用してファイルにアクセスする

Android 11 では、READ_EXTERNAL_STORAGE 権限を持つアプリは、直接ファイルパスとネイティブ ライブラリを使用して、デバイスのメディア ファイルを読み取れます。この機能により、アプリはサードパーティのメディア ライブラリでのスムーズな処理が可能になります。

直接ファイルパスとネイティブ ライブラリを使用する場合は、アプリのマニフェスト ファイルで requestLegacyExternalStoragetrue に設定して対象範囲別ストレージを無効にすることをおすすめします。これにより、Android 10 を搭載するデバイスでアプリが想定どおりに動作します。

他のアプリのプライベート ディレクトリへのアクセス

Android 11 では、アプリは外部ストレージにある別のどのアプリの専用ディレクトリにもアクセスできなくなりました。

ドキュメントへのアクセス制限

デベロッパーがテストする時間を設けるため、ストレージ アクセス フレームワーク(SAF)に関連する変更は、アプリが Android 11 をターゲットとした場合のみ有効になります。

ディレクトリへのアクセス

ACTION_OPEN_DOCUMENT_TREE インテントのアクションを使って以下のディレクトリへのアクセスをリクエストすることはできなくなりました。

  • 内部ストレージ ボリュームのルートディレクトリ。
  • エミューレートされているカードかリムーバブル カードかによらず、デバイス メーカーが信頼できるとみなす各 SD カード ボリュームのルート ディレクトリ。
  • Download ディレクトリ。

ファイルへのアクセス

ACTION_OPEN_DOCUMENT_TREE または ACTION_OPEN_DOCUMENT インテントのアクションを使って、以下のディレクトリから個々のファイルをユーザーに選択してもらうようリクエストすることはできなくなりました。

  • Android/data/ ディレクトリとすべてのサブディレクトリ。
  • Android/obb/ ディレクトリとすべてのサブディレクトリ。

変更をテストする

この動作変更は、以下の手順でテストします。

  1. ACTION_OPEN_DOCUMENT アクションを設定してインテントを呼び出します。Android/data/ ディレクトリと Android/obb/ ディレクトリが両方とも表示されないことを確認します。
  2. 次のいずれかを行います。
  3. ACTION_OPEN_DOCUMENT_TREE アクションを設定してインテントを呼び出します。Download ディレクトリが表示され、そのディレクトリに関連付けられたアクション ボタンがグレー表示になっていることを確認します。

権限

Android 11 では、ストレージの権限に関連する以下の変更が導入されました。

ターゲットとするバージョンによらない

最初のダイアログに「[設定] で許可してください」と表示される
図 1. 対象範囲別ストレージを使用するアプリが READ_EXTERNAL_STORAGE 権限をリクエストするときに表示されるダイアログ

Android 11 では、アプリのターゲット SDK のバージョンによらず、以下の変更が有効になります。

  • ストレージのランタイム権限が [ファイルとメディア] に変更されました。
  • アプリが対象範囲別ストレージをオプトアウトせずに READ_EXTERNAL_STORAGE 権限をリクエストすると、Android 10 とは異なるダイアログがユーザーに表示されます。図 1 に示すように、アプリが写真やメディアへのアクセスをリクエストしていることがダイアログに表示されます。

    ユーザーは READ_EXTERNAL_STORAGE 権限を持つアプリをシステム設定で確認できます。設定アプリ > [プライバシー] > [権限マネージャ] > [ファイルとメディア] のページで、その権限を持つアプリは [すべてのファイルで許可] の下に表示されます。

    注: アプリが Android 11 をターゲットとしている場合、「すべてのファイル」へのアクセスは読み取り専用となります。このアプリを使用して共有ストレージのすべてのファイルに対して読み取りと書き込みを行うには、[すべてのファイルへのアクセス] 権限を持つ必要があります。

Android 11 をターゲットとする

アプリが Android 11 をターゲットとしている場合、WRITE_EXTERNAL_STORAGE 権限と WRITE_MEDIA_STORAGE 特権の両方で、追加のアクセス権を提供しなくなりました。

すべてのファイルへのアクセス

一部のアプリには、ファイル管理やバックアップと復元の操作など、幅広くファイルへのアクセス権を必要とする重要なユースケースがあります。その場合、以下のようにすることで「すべてのファイルのアクセス」権限を取得できます。

  1. MANAGE_EXTERNAL_STORAGE 権限を宣言します。
  2. ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION インテントのアクションを使用してユーザーをシステム設定のページに移動します。そのページでユーザーは [すべてのファイルを管理できるアクセス権を付与] オプションを有効にすることができます。

すべてのファイルへのアクセス権限では、以下の権限が付与されます。

アプリは MediaStore API または raw ファイルパスのどちらかを使用してこのようなファイルにアクセスできます。ただし、アプリがストレージ アクセス フレームワークを使用する場合、すべてのファイルへのアクセス権限で使用できるようになる追加のファイルやディレクトリへのアクセスには、そのフレームワークは使用できません。

MANAGE_EXTERNAL_STORAGE 権限は、プライベート データが含まれる可能性のある共有ストレージ上のデータにアプリがアクセスできるようにするものです。デベロッパー プレビューの今後のバージョンでは、この権限が必要なアプリ向けのガイドラインを Google Play で提供する予定です。

この特別な権限の詳細と、Android 11 での Storage API へのその他の変更については、Medium の記事、Android の最新のユーザー ストレージをご覧ください。