アプリ コンテンツ用のディープリンクを作成する

クリックされたリンクまたはプログラムによるリクエストがウェブ URI インテントを呼び出すと、Android システムはリクエストが成功するまで以下の各アクションを順番に試行します。

  1. ユーザーの優先アプリ(URI を処理できるもの)が指定されている場合は、そのアプリを開きます。
  2. URI を処理できる、使用可能な唯一のアプリを開きます。
  3. ユーザーがダイアログからアプリを選択できるようにします。

下記の手順に沿って、コンテンツ用のリンクを作成し、テストします。また、Android Studio のアプリリンク アシスタントを使用して、Android アプリリンクを追加することもできます。

注: Android 12(API レベル 31)以降、汎用ウェブ インテントは、そのウェブ インテントに含まれる特定のドメインでアプリが承認されている場合にのみ、アプリ内のアクティビティに解決されます。アプリがドメインで承認されていない場合、ウェブ インテントは代わりにユーザーのデフォルトのブラウザアプリに解決されます。

受信リンク用のインテント フィルタを追加する

アプリ コンテンツへのリンクを作成するには、マニフェストに次の要素と属性値を含むインテント フィルタを追加します。

<action>
ACTION_VIEW インテントのアクションを指定して、Google 検索からインテント フィルタに到達できるようにします。
<data>
<data> タグを 1 つ以上追加します。各タグは、アクティビティに解決される URI 形式を表します。少なくとも、<data> タグには android:scheme 属性を含める必要があります。

属性を追加することで、アクティビティが受け入れる URI タイプを絞り込むことができます。たとえば、類似した URI を受け入れるが、パス名のみが異なるアクティビティが複数あるとします。この場合、android:path 属性またはその pathPattern または pathPrefix バリアントを使用して、システムがどのアクティビティをさまざまな URI パスで開くかを区別します。

<category>
BROWSABLE カテゴリを含めます。これは、ウェブブラウザからインテント フィルタにアクセスできるようにするために必要です。これがないと、ブラウザでリンクをクリックしてもアプリに解決されません。

また、DEFAULT カテゴリも指定します。 これにより、アプリが暗黙的インテントに応答できるようになります。これを指定しないと、インテントでアプリ コンポーネント名が指定されている場合にのみ、アクティビティを起動できます。

次の XML スニペットは、ディープリンクのマニフェストでインテント フィルタを指定する方法を示しています。URI “example://gizmos”“http://www.example.com/gizmos” はどちらもこのアクティビティに解決されます。

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
        <!-- note that the leading "/" is required for pathPrefix-->
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "example://gizmos” -->
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

2 つのインテント フィルタの違いは <data> 要素のみです。同じフィルタに複数の <data> 要素を含めることもできますが、一意の URL(schemehost の特定の組み合わせなど)を宣言する場合は、個別のフィルタを作成することが重要です。これは、同じインテント フィルタ内の複数の <data> 要素は、実際には結合された属性のすべてのバリエーションを考慮するためにマージされるためです。たとえば、次の点を考えます。

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

これは https://www.example.comapp://open.my.app のみをサポートしているように見えるかもしれません。実際には、これら 2 つに加えて、app://www.example.comhttps://open.my.app がサポートされています。

注意: 複数のアクティビティに、検証済みの同じ Android アプリリンクに対応するインテント フィルタが含まれている場合、どのアクティビティがリンクを処理するかは保証されません。

アクティビティ コンテンツの URI を含むインテント フィルタをアプリ マニフェストに追加すると、Android は、一致する URI を持つ Intent を実行時にアプリにルーティングできます。

インテント フィルタの定義について詳しくは、他のアプリからアクティビティの開始を許可するをご覧ください。

受信インテントからデータを読み取る

システムがインテント フィルタを通じてアクティビティを起動したら、Intent から提供されたデータを使用して、レンダリングする必要があるものを判断できます。getData() メソッドと getAction() メソッドを呼び出して、受信した Intent に関連付けられたデータとアクションを取得します。これらのメソッドは、アクティビティのライフサイクル中にいつでも呼び出すことができますが、通常は、onCreate()onStart() などの初期のコールバック中に呼び出す必要があります。

次のスニペットは、Intent からデータを取得する方法を示しています。

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val action: String? = intent?.action
    val data: Uri? = intent?.data
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}

ユーザー エクスペリエンスを向上させるには、次に示すおすすめの方法を採り入れます。

  • ディープリンクは、プロンプト、インタースティシャル ページ、ログインなしに、ユーザーをコンテンツに直接誘導する必要があります。ユーザーがアプリを開いたことがない場合でも、アプリのコンテンツを表示できるようにしてください。その後の操作や、ランチャーからアプリを開く際に、ユーザーにメッセージを表示しても問題はありません。
  • 「戻る」と「上へ」を使用したナビゲーションで説明されている設計ガイダンスに沿って、ユーザーがディープリンク経由でアプリを開いた後の「戻る」ナビゲーションに対するユーザーの期待に合わせるようにします。

ディープリンクをテストする

アクティビティ マネージャー(am)ツールで Android Debug Bridge を使用すると、ディープリンク用に指定したインテント フィルタ URI が正しいアプリ アクティビティに解決されることをテストできます。adb コマンドは、デバイスまたはエミュレータに対して実行できます。

adb でインテント フィルタ URI をテストする一般的な構文は、次のとおりです。

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>

たとえば、以下のコマンドは、指定された URI に関連付けられているターゲット アプリのアクティビティを表示しようとします。

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d "example://gizmos" com.example.android

上記で設定したマニフェスト宣言とインテント ハンドラにより、アプリとウェブサイト間の接続と、受け取ったリンクの処理方法が定義されます。ただし、アプリが一連の URI のデフォルト ハンドラとして扱われるようにするには、この接続を検証するようシステムにリクエストする必要があります。次のレッスンでは、この検証を実装する方法について説明します。

インテントやアプリリンクの詳細については、以下の参考リンクをご覧ください。