Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

アプリ コンテンツへのディープリンクの作成

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

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

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

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

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

<action>
Google 検索からインテント フィルタに到達できるように ACTION_VIEW インテント アクションを指定します。
<data>
1 つ以上の <data> タグを追加します。各タグは、アクティビティに解決される 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 もサポートしています。

アクティビティ コンテンツの 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();
    }
    

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

  • ディープリンクは、プロンプト、インタースティシャル ページ、またはログインなしで、ユーザーをコンテンツに直接誘導する必要があります。以前にアプリケーションを開いたことがない場合でも、ユーザーがアプリのコンテンツを表示できるようにします。その後の操作では、またはランチャーからアプリを開いたときは、ユーザーにプロンプトを表示してもかまいません。この原則は、ウェブサイトの First Click Free エクスペリエンスと同じです。
  • ユーザーがディープリンクを介してアプリにアクセスした後、ユーザーが期待する逆方向ナビゲーションを実現できるように、Back ボタンと Up ボタンを使用したナビゲーションで説明されている設計ガイダンスに従います。

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

アクティビティ マネージャー(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 のデフォルト ハンドラとして扱われるようにするには、この接続を検証するようにリクエストする必要もあります。次のレッスンでは、この検証を実装する方法について説明します。

インテントとアプリリンクの詳細については、次のリソースをご覧ください。