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

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

リンクのタップやプログラマティック リクエストがウェブ URI インテントを呼び出した場合、Android システムは、リクエストが成功するまで、以下のアクションをこの順序で試行します。

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

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

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

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

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

属性を追加することで、アクティビティが受け入れる URI タイプを絞り込むことができます。たとえば、ベースとなるパス名だけが異なる類似の URI をそれぞれ受け入れる複数のアクティビティがあるとします。このような場合、android:path 属性またはそのバリアント(pathPatternpathPrefix)を使用することで、各 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> 要素だけです。1 つのフィルタに複数の <data> 要素を組み込むことは可能ですが、一意の URL(schemehost の特定の組み合わせなど)を宣言する場合は、それぞれ個別のフィルタを作成する必要があります。1 つのインテント フィルタ内に複数の <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();
    }
    

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

  • ディープリンクは、プロンプトや、インタースティシャル ページ、ログインなしで、ユーザーをコンテンツに直接誘導する必要があります。ユーザーがそのアプリを以前に開いたことがない場合でも、アプリ コンテンツを表示できるようにしてください。対象コンテンツの表示後に後続の操作をユーザーが行った場合や、ランチャーからアプリを開いた場合は、プロンプトを表示しても構いません。
  • ユーザーがディープリンク経由でアプリにアクセスした後、想定どおりに [戻る] ナビゲーションを実現できるように、[戻る] ボタンと [上へ] ボタンを使用したナビゲーションで説明されている設計ガイダンスに沿うようにしてください。

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

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 セットのデフォルト ハンドラとして扱うようにするには、この接続自体を検証するようにリクエストする必要があります。次のレッスンでは、この検証機能を実装する方法について説明します。

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