アプリを作成する際は、アプリがアクセスする予定の、デバイスにインストール済みの他のアプリのセットを考慮することが重要です。Android 11(API レベル 30)以降をターゲットとするアプリの場合、システムによっていくつかのアプリは自動的に公開されますが、他のアプリはデフォルトでは除外されます。このガイドでは、このような他のアプリを自分のアプリに公開する方法について説明します。
Android 11 以降をターゲットとするアプリで、自動的に公開されるアプリ以外のアプリとの連携が必要な場合は、アプリのマニフェスト ファイルに <queries>
要素を追加します。次のセクションで説明するように、<queries>
要素内では、パッケージ名、インテント シグネチャ、またはプロバイダ オーソリティによって、他のアプリを指定できます。
特定のパッケージ名
別のアプリを自分のアプリに統合する場合や、自分のアプリで別のアプリのサービスを使用する場合など、アプリがクエリや連携を行う特定のアプリのセットについて把握している場合は、そのパッケージ名を <queries>
要素内の <package>
要素のセットに含めます。
<manifest package="com.example.game"> <queries> <package android:name="com.example.store" /> <package android:name="com.example.services" /> </queries> ... </manifest>
ライブラリ内のホストアプリと通信する
Android ライブラリを開発する場合は、AAR マニフェスト ファイルで <queries>
要素を追加することで、パッケージの公開設定の必要性を宣言できます。この <queries>
要素の機能は、アプリが独自のマニフェストで宣言できる要素と同じです。
ライブラリが「ホスト」アプリとの通信を伴う場合(バインドされたサービスの使用など)、ホストアプリのパッケージ名を指定する <package>
要素を含めます。
<!-- Place inside the <queries> element. --> <package android:name=PACKAGE_NAME />
この宣言を含めることで、bindService()
の呼び出しなどにより、ホストアプリがインストールされているかどうかを確認でき、連携できます。ライブラリを使用する呼び出し元アプリは、この連携の結果として、ホストアプリに自動的に公開されます。
インテント フィルタ シグネチャに一致するパッケージ
アプリが特定の目的を果たすアプリのセットに対してクエリや連携を行う必要があっても、指定するその個々のパッケージ名がわからない場合があります。その場合は、インテント フィルタのシグネチャのリストを <queries>
要素に指定できます。それにより、アプリは一致する <intent-filter>
要素を持つアプリを見つけることができます。
次の例では、JPEG 画像の共有をサポートするインストール済みのアプリを見つけることができます。
<manifest package="com.example.game"> <queries> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="image/jpeg" /> </intent> </queries> ... </manifest>
<intent>
要素には以下のような制限があります。
<action>
要素は 1 つだけ含める必要があります。<data>
要素内でpath
、pathPrefix
、pathPattern
、port
の各属性を使用することはできません。各属性の値を汎用のワイルドカード文字(*
)に設定した場合と同じように動作することになります。<data>
要素のmimeGroup
属性は使用できません。1 つの
<intent>
要素の複数の<data>
要素にわたって、以下の各属性を 1 回だけ使用できます。mimeType
scheme
host
これらの属性は複数の
<data>
要素に分散させることも、1 つの<data>
要素で使用することもできます。
<intent>
要素は、属性の値として以下の汎用のワイルドカード文字(*
)をサポートしています。
<action>
要素のname
属性。<data>
要素のmimeType
属性のサブタイプ(image/*
)。<data>
要素のmimeType
属性のタイプとサブタイプ(*/*
)。<data>
要素のscheme
属性。<data>
要素のhost
属性。
前のリストで特に指定されていない限り、システムはテキストとワイルドカード文字(prefix*
など)の組み合わせに対応していません。
特定のオーソリティを使用するパッケージ
コンテンツ プロバイダにクエリする必要があるものの、具体的なパッケージ名がわからない場合は、次のスニペットに示すように、<provider>
要素でプロバイダ オーソリティを宣言できます。
<manifest package="com.example.suite.enterprise"> <queries> <provider android:authorities="com.example.settings.files" /> </queries> ... </manifest>
すべてのプロバイダ オーソリティを 1 つの <queries>
要素で宣言できます。形式は、宣言するプロバイダ オーソリティの数によって異なります。
- 単一の <provider> 要素
- 要素で、セミコロン区切りのオーソリティのリストを宣言します。
- 複数の <provider> 要素
- 各要素で、1 つのオーソリティ、またはセミコロン区切りのオーソリティのリストを宣言します。
すべてのアプリ(非推奨)
まれなケースですが、アプリがデバイス上のインストール済みのアプリの「すべて」に対して、各アプリに含まれるコンポーネントによらず、クエリや連携を行うことが必要になる場合があります。アプリがインストール済みの他のすべてのアプリを見つけられるように、QUERY_ALL_PACKAGES
権限が用意されています。
QUERY_ALL_PACKAGES
権限を含めたほうがよいユースケースの例を以下に示します。
- ユーザー補助機能を利用できるアプリ
- ブラウザ
- デバイス管理アプリ
- セキュリティ アプリ
- ウイルス対策アプリ
ただしほとんどの場合、自動的に公開される一連のアプリと連携し、マニフェスト ファイルでアプリがアクセスする必要のある他のアプリを宣言することで、アプリのユースケースを満たすことができます。ユーザーのプライバシーを尊重し、アプリの動作に最低限必要な範囲で、パッケージへのアクセスをリクエストしてください。
Google Play のポリシー更新では、QUERY_ALL_PACKAGES
権限を必要とするアプリに関するガイドラインを提供しています。