ストレージ デバイスのすべてのファイルを管理する

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

たとえば、ウイルス対策アプリの主要なユースケースでは、さまざまなディレクトリで多数のファイルを定期的にスキャンする必要があります。このスキャンで、ユーザーがシステム ファイル選択ツールを使用して繰り返しディレクトリを選択する必要があるとすれば、ユーザー エクスペリエンスは低下します。他のユースケース(ファイル マネージャー アプリ、バックアップと復元を行うアプリ、ドキュメント管理アプリなど)でも、同様の状況を考慮する必要があります。

すべてのファイルへのアクセスをリクエストする

アプリでは、以下の手順を使用して、すべてのファイルへのアクセスをユーザーにリクエストできます。

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

アプリに MANAGE_EXTERNAL_STORAGE 権限が付与されているかどうかを判断するには、Environment.isExternalStorageManager() を呼び出します。

MANAGE_EXTERNAL_STORAGE で許可されるオペレーション

MANAGE_EXTERNAL_STORAGE 権限により、以下の権限が付与されます。

  • 共有ストレージ内のすべてのファイルへの読み取りアクセス権と書き込みアクセス権。

  • MediaStore.Files テーブルの内容へのアクセス権。

  • USB On The Go(OTG)ドライブと SD カードの両方のルート ディレクトリへのアクセス権。

  • /Android/data//sdcard/Android、および /sdcard/Android のほとんどのサブディレクトリを除く、すべての内部ストレージ ディレクトリへの書き込みアクセス権。この書き込みアクセス権には、直接ファイルパスのアクセス権が含まれています。

    この権限を付与されたアプリでも、他のアプリに属するアプリ専用ディレクトリにはアクセスできません。このようなディレクトリは、ストレージ ボリューム上で Android/data/ のサブディレクトリとして表示されるためです。

アプリに MANAGE_EXTERNAL_STORAGE 権限がある場合は、MediaStore API または直接ファイルパスを使用して、これらの追加のファイルとディレクトリにアクセスできます。ただし、ストレージ アクセス フレームワークを使用している場合は、MANAGE_EXTERNAL_STORAGE 権限がなくてもアクセスできるファイルまたはディレクトリにしかアクセスできません。

別のアプリのストレージ管理アクティビティを呼び出す

Android 12(API レベル 31)以降では、MANAGE_EXTERNAL_STORAGE 権限と QUERY_ALL_PACKAGES 権限の両方があるアプリ(ファイル管理アプリなど)は、getManageSpaceActivityIntent() を使用して、ユーザーを別のアプリのカスタム容量管理アクティビティに誘導できます。

getManageSpaceActivityIntent() メソッドは、パッケージ名とリクエスト コードを受け取り、次のいずれかを返します。

  • 指定したパッケージ名を持つアプリでカスタム「容量管理」アクティビティを定義している場合、PendingIntentgetManageSpaceActivityIntent() メソッドを呼び出したファイル管理アプリは、返されたインテントを呼び出して、ユーザーをカスタム アクティビティに誘導できます。
  • 指定したパッケージ名を持つアプリで「容量管理」アクティビティを定義していない場合、null

テストのために MANAGE_EXTERNAL_STORAGE を有効にする

MANAGE_EXTERNAL_STORAGE 権限がアプリに及ぼす影響を調べるには、テスト目的で権限を有効にします。これを行うには、テストデバイスに接続されているマシンで次のコマンドを実行します。

adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow

Google Play に関する注意事項

このセクションでは、Google Play でアプリを公開するデベロッパー向けの注意事項について説明します。

共有ストレージへの広範なアクセスを制限するため、Google Play ストアでは、Android 11(API レベル 30)以降をターゲットとするアプリを評価し、MANAGE_EXTERNAL_STORAGE 権限を介して「すべてのファイルへのアクセス」をリクエストするようにポリシーをアップデートしました。このポリシーは 2021 年 5 月に発効します。

Android 11 以降をターゲットとするアプリで MANAGE_EXTERNAL_STORAGE 権限を宣言すると、Android Studio に図 1 のような lint 警告が表示されます。これは、この権限の「使用を制限するポリシーが Google Play ストアにある」ことを注意喚起する警告です。

図 1. MANAGE_EXTERNAL_STORAGE 権限に関する Google Play のポリシーについて注意喚起する、Android Studio の lint 警告。

ストレージ アクセス フレームワークMedia Store API など、よりプライバシーに配慮した API をアプリで効果的に利用できない場合にのみ、MANAGE_EXTERNAL_STORAGE 権限をリクエストしてください。また、アプリによる権限の用途は、許容される用途に該当し、アプリのコア機能に直接関連している必要があります。次の例に類似したユースケースがアプリに含まれる場合は、MANAGE_EXTERNAL_STORAGE 権限をリクエストできる可能性が高くなります。

  • ファイル マネージャー
  • バックアップと復元のアプリ
  • ウイルス対策アプリ
  • ドキュメント管理アプリ
  • デバイス上のファイル検索
  • ディスクとファイルの暗号化
  • デバイス間のデータ移行