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

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

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

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

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

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

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

<action>
インテントのアクション「ACTION_VIEW」を Google 検索からインテント フィルタに到達できることを確認します。
<data>
1 つ以上の <data> タグを追加します。各タグは、アクティビティに変換される URI 形式を示します。少なくとも、 <data> タグには次を含める必要があります。 android:scheme 属性です。

属性を追加することで、アクティビティが受け入れる URI タイプを絞り込むことができます。対象 たとえば、類似した 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.com と、 app://open.my.app。しかし、実際には、上記の 2 つに加えて app://www.example.comhttps://open.my.app もサポートしています。

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

アクティビティ コンテンツの URI を含むインテント フィルタをアプリに追加した後 Android は任意の Intent をルーティングできます。 実行時にアプリに一致する URI を持つオブジェクトが生成されます。

インテント フィルタの定義方法については、別のアプリからアクティビティを起動するのを許可するをご覧ください。

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

システムがインテント フィルタ経由でアクティビティを起動したら、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();
}

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

  • ディープリンクは、プロンプトや、インタースティシャル ページ、ログインなしで、ユーザーをコンテンツに直接誘導する必要があります。ユーザーが以下の操作を行えるように そのユーザーが以前にアプリケーションを開いたことがない場合でも、アプリのコンテンツを見ることができるということです。 その後の操作やアプリの起動時にユーザーにメッセージを表示しても問題ない クリックします。
  • ユーザーがディープリンクを介してアプリにアクセスした後、ユーザーが期待する逆方向ナビゲーションを実現できるように、[戻る] ボタンと [上へ] ボタンを使用したナビゲーションで説明されている設計ガイダンスに従います。

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

Android Debug Bridge と Activity Manager(am)ツールを使用することで、ディープリンク用に指定したインテント フィルタ 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 のデフォルト ハンドラとして扱われるようにするには、この接続を検証するようにリクエストすることも必要です。 次のレッスンでは、この検証を実装する方法について説明します。

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