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

Android 11(API レベル 30)では、プラットフォームをさらに強化し、外部ストレージ上のアプリとユーザーのデータの保護を改善しています。このリリースでは、raw ファイルパスへのアクセス、メディアの一括編集操作、ストレージ アクセス フレームワークの UI の更新などの機能強化が行われています。

また、このリリースでは対象範囲別ストレージも改善されているため、デベロッパーはこのストレージ モデルへの移行後にストレージのユースケースを簡単に実現できます。

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

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

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

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

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

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

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

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

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

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

Android 11 以降、対象範囲別ストレージ モデルを使用するアプリでは、アプリ固有のキャッシュ ファイルだけにアクセスできます。アプリでデバイス ストレージを管理する必要がある場合は、空き領域をクエリする方法をご覧ください。

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

外部ストレージ内のアプリ固有のディレクトリ

Android 11 以降、アプリで外部ストレージ上にアプリ固有のディレクトリを作成できません。お使いのアプリ専用のディレクトリにアクセスするには、getExternalFilesDirs() を呼び出します。

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

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

一括操作を行う

デバイス間の一貫性を保ち、ユーザーの利便性を高めるため、Android 11 では複数のメソッドを追加し、メディア ファイルのグループを管理しやすくしています。

直接ファイルパスとネイティブ ライブラリを使用してファイルにアクセスする

Android 11 では、サードパーティのメディア ライブラリでアプリをよりスムーズに動作させるため、MediaStore API 以外の API 経由で、直接ファイルパスを使用して共有ストレージのメディア ファイルにアクセスできます。該当する API には次のものがあります。

  • File API
  • ネイティブ ライブラリ(fopen() など)。

他のアプリからのデータへのアクセス

Android 11 以降が実行されているデバイスでは、ユーザーのプライバシーを保護するために、アプリから他のアプリのプライベート ディレクトリへのアクセスを制限しています。

内部ストレージのデータ ディレクトリへのアクセス

Android 9(API レベル 28)以降、内部ストレージのデータ ディレクトリにあるファイルを他のアプリから誰でもアクセスできるようにするアプリは制限されています。Android 9 以降をターゲットとするアプリでは、データ ディレクトリにあるファイルを誰でもアクセスできるようにはできません

Android 11 では、この制限が拡張されています。Android 11 をターゲットとするアプリでは、他のアプリが Android 8.1(API レベル 27)以前をターゲットとしており、データ ディレクトリにあるファイルを誰でも読み取り可能としている場合であっても、他のアプリのデータ ディレクトリにあるファイルにアクセスできません。

外部ストレージ上のアプリ固有のディレクトリへのアクセス

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 特権の両方で、追加のアクセス権を提供しなくなりました。

Android 10(API レベル 29)以上を実行するデバイスでは、ストレージ関連の権限をリクエストしなくても、アプリは MediaStore.Downloads などの明確に定義されたメディア コレクションにデータを書き込むことができます。詳しくは、アプリ内のメディア ファイルを操作する場合に必要な権限だけをリクエストする方法をご確認ください。

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

共有ストレージへのアクセスを必要とするアプリの大半は、メディア ファイルの共有メディア以外のファイルの共有に関するおすすめの方法に従うことが可能です。しかし、一部のアプリでは、重要なユースケースでデバイス上のファイルへの幅広いアクセスが必要な場合に、プライバシーに配慮したストレージのおすすめの方法を効率的に使用することができません。Android では、このような状況を考慮して「すべてのファイルへのアクセス」と呼ばれる特別なアプリアクセスが用意されています。詳細については、ストレージ デバイス上のすべてのファイルを管理する方法をご覧ください。

参考情報

Android 11 でのストレージの変更について詳しくは、次の資料をご覧ください。

ブログ投稿

動画