Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

Android 11 でのパッケージ公開設定のユースケース

このドキュメントでは、アプリが他のアプリと連携する場合の一般的なユースケースの例を紹介します。各セクションでは、Android 11 でのパッケージ公開設定の動作変更に対応するための、アプリのアップデート方法について説明します。

アプリが Android 11 をターゲットとし、暗黙的インテントを使用して別のアプリでアクティビティを開始する場合、最も簡単な方法は、インテントを呼び出し、利用可能なアプリがないときは ActivityNotFoundException 例外を処理することです。

アプリの一部が、UI の表示など、startActivity() の呼び出しが成功するかどうかを認識することに依存する場合は、要素をアプリのマニフェストの <queries> 要素に追加します。通常、この新しい要素は <intent> 要素です。

URL を開く

このセクションでは、Android 11 をターゲットとするアプリで URL を開く方法について説明します。アプリで URL を開く方法に応じて、次のサブセクションのいずれかの例に従ってください。

ブラウザまたは他のアプリで URL を開く

URL を開くには、ウェブ URL を読み込む方法に関するセクションの説明にあるように、ACTION_VIEW インテントのアクションを含むインテントを使用します。このインテントを使用して startActivity() を呼び出すと、次のいずれかが発生します。

  • ウェブブラウザ アプリで URL が開く。
  • URL をディープリンクとしてサポートしているアプリで URL が開く。
  • URL を開くアプリを選択できる確認ダイアログが表示される。
  • URL を開けるアプリがデバイスにインストールされていないために ActivityNotFoundException が発生する(これは異常です)。

    ActivityNotFoundException が発生した場合は、アプリで捕捉して処理することをおすすめします。

アプリは暗黙的インテントを使用して URL を開くため、アプリのマニフェストに <queries> 要素を追加する必要はありません。

ブラウザが利用可能かどうかを確認する

場合によっては、URL を開く前、デバイスにブラウザが少なくとも 1 つあること、または特定のブラウザがデフォルトのブラウザであることをアプリで確認する必要があります。その場合は、マニフェストで <queries> 要素の一部として次の <intent> 要素を含めます。

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="https" />
</intent>

次に queryIntentActivities() を呼び出し、引数としてウェブ インテントを渡すと、使用可能なブラウザアプリのリストが返されます。

カスタムタブで URL を開く

カスタムタブを使用すると、ブラウザの外観と操作性をカスタマイズできます。アプリ マニフェストで <queries> 要素を追加または変更せずに、カスタムタブで URL を開くことができます。

しかし、カスタムタブをサポートするブラウザがデバイスにあるかどうかを確認するか、CustomTabsClient.getPackageName() を使用してカスタムタブとともに起動する特定のブラウザを選択することをおすすめします。そのような場合は、マニフェストで <queries> 要素の一部として次の <intent> 要素を含めます。

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.support.customtabs.action.CustomTabsService" />
</intent>

ブラウザ以外のアプリに URL を処理させる

アプリでカスタムタブを使用して URL を開くことができる場合でも、可能であればブラウザ以外のアプリで URL を開くようにすることをおすすめします。この機能をアプリで提供するには、FLAG_ACTIVITY_REQUIRE_NON_BROWSER インテント フラグを設定するインテントを使用して、startActivity() を呼び出します。システムが ActivityNotFoundException をスローしたら、アプリはカスタムタブで URL を開くことができます。

このフラグがインテントに含まれている場合、startActivity() を呼び出すと、次のいずれかの条件が発生したときに ActivityNotFoundException がスローされます。

  • 呼び出しでブラウザアプリが直接起動される。
  • 呼び出しでユーザーに確認ダイアログが表示される(オプションはブラウザアプリのみ)。

次のコード スニペットは、FLAG_ACTIVITY_REQUIRE_NON_BROWSER インテント フラグを使用するようにロジックを更新する方法を示しています。

Kotlin

try {
    val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply {
        // The URL should either launch directly in a non-browser app (if it's
        // the default), or in the disambiguation dialog.
        addCategory(CATEGORY_BROWSABLE)
        flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER
    }
    startActivity(intent)
} catch (e: ActivityNotFoundException) {
    // Only browser apps are available, or a browser is the default.
    // So you can open the URL directly in your app, for example in a
    // Custom Tab.
    openInCustomTabs(url)
}

Java

try {
    Intent intent = new Intent(ACTION_VIEW, Uri.parse(url));
    // The URL should either launch directly in a non-browser app (if it's the
    // default), or in the disambiguation dialog.
    intent.addCategory(CATEGORY_BROWSABLE);
    intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_REQUIRE_NON_BROWSER);
    startActivity(intent);
} catch (ActivityNotFoundException e) {
    // Only browser apps are available, or a browser is the default.
    // So you can open the URL directly in your app, for example in a
    // Custom Tab.
    openInCustomTabs(url);
}

確認ダイアログを回避する

ユーザーが URL を開いたときに表示される可能性のある確認ダイアログを表示せず、代わりにこのような状況では独自に URL を処理する場合、FLAG_ACTIVITY_REQUIRE_DEFAULT インテント フラグを設定するインテントを使用できます。

このフラグがインテントに含まれている場合、startActivity() を呼び出すと、ユーザーに確認ダイアログが表示されたときに ActivityNotFoundException がスローされます。

このフラグと FLAG_ACTIVITY_REQUIRE_NON_BROWSER インテント フラグの両方がインテントに含まれている場合、startActivity() を呼び出すと、次のいずれかの条件が発生したときに ActivityNotFoundException がスローされます。

  • 呼び出しでブラウザアプリが直接起動される。
  • 呼び出しでユーザーに確認ダイアログが表示される。

次のコード スニペットは、FLAG_ACTIVITY_REQUIRE_NON_BROWSER フラグと FLAG_ACTIVITY_REQUIRE_DEFAULT フラグを併用する方法を示しています。

Kotlin

val url = URL_TO_LOAD
try {
    // In order for this intent to be invoked, the system must directly launch a
    // non-browser app.
    val intent = Intent(ACTION_VIEW, Uri.parse(url).apply {
        addCategory(CATEGORY_BROWSABLE)
        flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER or
                FLAG_ACTIVITY_REQUIRE_DEFAULT
    }
    startActivity(intent)
} catch (e: ActivityNotFoundException) {
    // This code executes in one of the following cases:
    // 1. Only browser apps can handle the intent.
    // 2. The user has set a browser app as the default app.
    // 3. The user hasn't set any app as the default for handling this URL.
    openInCustomTabs(url)
}

Java

String url = URL_TO_LOAD;
try {
    // In order for this intent to be invoked, the system must directly launch a
    // non-browser app.
    Intent intent = new Intent(ACTION_VIEW, Uri.parse(url));
    intent.addCategory(CATEGORY_BROWSABLE);
    intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_REQUIRE_NON_BROWSER |
            FLAG_ACTIVITY_REQUIRE_DEFAULT);
    startActivity(intent);
} catch (ActivityNotFoundException e) {
    // This code executes in one of the following cases:
    // 1. Only browser apps can handle the intent.
    // 2. The user has set a browser app as the default app.
    // 3. The user hasn't set any app as the default for handling this URL.
    openInCustomTabs(url);
}

ファイルを開く

デバイスが特定のファイルを開くことができるかどうかの確認など、アプリがファイルまたは添付ファイルを処理する場合、通常は、ファイルを処理できるアクティビティを開始すると簡単です。これを行うには、ACTION_VIEW インテントのアクションと特定のファイルを表す URI が含まれるインテントを使用します。利用可能なアプリがデバイスにない場合、アプリは ActivityNotFoundException を捕捉できます。例外処理ロジックでは、エラーを表示するか、自分でファイルを処理できます。

別のアプリが特定のファイルを開くことができるかどうかをアプリで事前に知る必要がある場合は、マニフェストで <queries> 要素の一部として、次のコード スニペットの <intent> 要素を含めます。コンパイル時にファイル形式がわかっている場合は、そのファイル形式を含めます。

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.VIEW" />
  <!-- If you don't know the MIME type in advance, set "mimeType" to "*/*". -->
  <data android:mimeType="application/pdf" />
</intent>

インテントを使用して resolveActivity() を呼び出すことで、アプリが利用可能かどうかを確認できます。

カスタム共有シートを作成する

可能な限り、システム提供の共有シートを使用してください。または、マニフェストで <queries> 要素の一部として、次の <intent> 要素を含めます。

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.SEND" />
  <!-- Replace with the MIME type that your app works with, if needed. -->
  <data android:mimeType="image/jpeg" />
</intent>

queryIntentActivities() の呼び出しなど、アプリのロジックで共有シートを作成するプロセスは、以前のバージョンの Android と比べて変更されていません。

テキスト読み上げエンジンに接続する

アプリがテキスト読み上げ(TTS)エンジンとやり取りする場合は、マニフェストで <queries> 要素の一部として、次の <intent> 要素を含めます。

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.TTS_SERVICE" />
</intent>

メディア ブラウザ サービスに接続する

クライアント メディア ブラウザアプリでは、マニフェストで <queries> 要素の一部として、次の <intent> 要素を含めます。

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.media.browse.MediaBrowserService" />
</intent>

連絡先のカスタムデータ行を表示する

アプリで、連絡先プロバイダにカスタムデータ行を追加できます。このカスタムデータを連絡帳アプリで表示するには、次の操作を行えるようにする必要があります。

  1. 他のアプリから contacts.xml ファイルを読み取る。
  2. カスタム MIME タイプに対応するアイコンを読み込む。

アプリが連絡帳アプリの場合は、マニフェストで <queries> 要素の一部として、次の <intent> 要素を含めます。

<!-- Place inside the <queries> element. -->
<!-- Allows the app to read the "contacts.xml" file from the other apps. -->
<intent>
  <action android:name="android.accounts.AccountAuthenticator" />
</intent>
<!-- Allows the app to load an icon corresponding to the custom MIME type. -->
<intent>
  <action android:name="android.intent.action.VIEW" />
  <data android:scheme="content" android:host="com.android.contacts"
        android:mimeType="vnd.android.cursor.item/*" />
</intent>

ライブラリでパッケージの公開設定の必要性を宣言する

Android ライブラリを開発する場合は、AAR マニフェスト ファイル<queries> 要素を追加することで、パッケージの公開設定の必要性を宣言できます。この <queries> 要素の機能は、アプリが独自のマニフェストで宣言できる要素と同じです。

ライブラリが「ホスト」アプリとの通信を伴う場合(バインドされたサービスの使用など)、ホストアプリのパッケージ名を指定する <package> 要素を含めます。

<!-- Place inside the <queries> element. -->
<package android:name=PACKAGE_NAME />

この宣言を含めることで、bindService() の呼び出しなどにより、ホストアプリがインストールされているかどうかを確認でき、やり取りできます。 ライブラリを使用する呼び出し元アプリは、このやり取りの結果として、ホストアプリに自動的に表示されます