パーソナル コンテンツ インデックス処理を有効にする

パーソナル コンテンツ インデックス処理では、ユーザーのアカウントに関連付けられたコンテンツに関して、Google アプリの検索結果を自分のアプリから提供できます。ユーザーの端末にはそのユーザーのパーソナル コンテンツだけが表示されます。

たとえば、ユーザーが「お気に入りの鶏肉レシピ」を検索した場合、ユーザーがレシピアプリで鶏肉レシピに追加したメモが [アプリ内] タブに表示されます。

アプリにパーソナル コンテンツを含めない場合は、この手順をスキップして、ユーザー アクションを記録するに直接進むことができます。

開始する前に、アプリ コンテンツへのリンクをサポートし、アプリに App Indexing ライブラリを追加したことを確認してください。

インデックスを設定してオブジェクトを追加する

JobIntentService を拡張するクラスを作成します。このドキュメントで説明する実装は、JobIntentService クラスに依存して端末上のインデックス更新作業をキューに入れますが、別のクラスを使用して作業スケジュールを設定することもできます。JobIntentService クラスを使用した実装を行う場合には、プロジェクトの build.gradle ファイルに Android サポート ライブラリを追加する必要があります。

次に、項目をアプリのパーソナル コンテンツ インデックスに含めるため、同じクラスで Indexable オブジェクトを作成します。

package com.example.myapp;

import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v4.app.JobIntentService;
import com.google.firebase.appindexing.builders.Indexables;
import com.google.firebase.appindexing.FirebaseAppIndex;
import com.google.firebase.appindexing.Indexable;
import java.util.ArrayList;

public class AppIndexingUpdateService extends JobIntentService {
  // Job-ID must be unique across your whole app.
  private static final int UNIQUE_JOB_ID = 42;

  public static void enqueueWork(Context context) {
    enqueueWork(context, AppIndexingUpdateService.class, UNIQUE_JOB_ID, new Intent());
  }

  @Override
  protected void onHandleWork(@NonNull Intent intent) {
    // TODO Insert your Indexable objects — for example, the recipe notes look as follows:

    ArrayList<Indexable> indexableNotes = new ArrayList<>();

    for (Recipe recipe : getAllRecipes()) {
        Note note = recipe.getNote();
        if (note != null) {
            Indexable noteToIndex = Indexables.noteDigitalDocumentBuilder()
                    .setName(recipe.getTitle() + " Note")
                    .setText(note.getText())
                    .setUrl(recipe.getNoteUrl())
                    .build();

            indexableNotes.add(noteToIndex);
        }
    }

    if (indexableNotes.size() > 0) {
        Indexable[] notesArr = new Indexable[indexableNotes.size()];
        notesArr = indexableNotes.toArray(notesArr);

        // batch insert indexable notes into index
        FirebaseAppIndex.getInstance().update(notesArr);
    }
  }

パーソナル コンテンツ インデックスに含めるもの

以下の種類のコンテンツについて、Indexable オブジェクトを定義します。

  • メッセージ、写真、ドキュメントなどのユーザー固有のコンテンツ。
  • お気に入りや頻繁にアクセスするコンテンツなどの、ユーザーにとって重要なコンテンツ。たとえば、ブックマークされたまたはオフライン使用としてマークされたドキュメントや歌など。
  • アプリでアクセスするだけでなく、アプリ内で生成するコンテンツ。たとえば、スマートフォンの電話帳にある連絡先ではなく、ユーザーが直接アプリで作成して保存した連絡先。

アプリにブロードキャスト レシーバーを追加する

Google Play 開発者サービスはアプリに、端末上のインデックスを更新するよう定期的にリクエストを送信します。BroadcastReceiver クラスはこのリクエストを受け取り、インデックス作業を処理するために JobIntentService をトリガーします。以下の例では、前の手順の AppIndexingUpdateService クラスを使用しています。

package com.example.myapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.google.firebase.appindexing.FirebaseAppIndex;

/** Receives broadcast for App Indexing Update. */
public class AppIndexingUpdateReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    if (intent != null
        && FirebaseAppIndex.ACTION_UPDATE_INDEX.equals(intent.getAction())) {
      // Schedule the job to be run in the background.
      AppIndexingUpdateService.enqueueWork(context);
    }
  }
}

インデックスを生成して更新する

次に、以下の 3 つの状況下で Google Play 開発者サービスが App Indexing サービスを呼び出して端末上のインデックスを更新し、ユーザーのパーソナル コンテンツがインデックスに反映されるようにします。

  • アプリが端末上にインストールされるとき
  • アプリの既存のバージョンが、パーソナル コンテンツ インデックス処理をサポートするバージョンに更新された場合
  • インデックス処理されるコンテンツの変更内容を正確に反映し、シームレスなユーザー エクスペリエンスを確保するための定期的な呼び出し

加えて、端末上のインデックスがなんらかの理由(インデックスが破損した場合など)で消失した場合は、インデックスを更新するためのこの呼び出しで再生成されます。

AndroidManifest.xml ファイルで BroadcastReceiver を登録し、Google Play 開発者サービスからの呼び出しを受け取り、インデックスを更新できるようにします。以下の例では、JobIntentService クラスを使用して、インデックス更新のスケジュールを設定しています。

<!-- Register the BroadcastReceiver -->
<receiver android:name=".AppIndexingUpdateReceiver"
         android:exported="true"
         android:permission="com.google.android.gms.permission.APPINDEXING">
    <intent-filter>
        <action android:name="com.google.firebase.appindexing.UPDATE_INDEX" />
    </intent-filter>
</receiver>

<!-- Grant the AppIndexingUpdateService permission and enable it to run after being triggered -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<service android:name=".AppIndexingUpdateService"
         android:permission="android.permission.BIND_JOB_SERVICE" />

インデックスを更新する

ユーザーがパーソナル コンテンツを追加、更新、または削除した際は、端末上のインデックスにそれらの変更を反映する必要があります。インデックス内のコンテンツを更新するには、次のコードを追加します。

追加と更新
private void indexNote() {
        Note note = mRecipe.getNote();
        Indexable noteToIndex = Indexables.noteDigitalDocumentBuilder()
                .setName(mRecipe.getTitle())
                .setText(note.getText())
                .setUrl(mRecipe.getNoteUrl())
                .build();

        Task<Void> task = FirebaseAppIndex.getInstance().update(noteToIndex);
         ...
    }
    
削除

削除する項目を特定するには、その項目の URL を使用します。次の行を、アプリのその項目に関する delete または remove 関数に追加します。

                    // Deletes or removes the corresponding notes from index.
                    String noteUrl = mRecipe.getNoteUrl();
                    FirebaseAppIndex.getInstance().remove(noteUrl);
         

ユーザーのログアウト時にインデックスを削除する

ユーザーがアプリからログアウトしたとき、ログアウト イベントで端末上のインデックスを削除します。この場合、ユーザーが再びログインしたときに端末上のインデックスが再生成されるように、AppIndexingService を使用してインデックスを生成および更新する呼び出しを含めます。

ユーザーがアプリからログアウトしたときに端末上のインデックスを削除するには、次のコードをアプリに追加します。

...
import com.google.firebase.appindexing.FirebaseAppIndex;

public class LogOutActivity extends Activity {
    ...
    private void onLogOutButtonClicked() {
        ...
        FirebaseAppIndex.getInstance().removeAll();
    }
}

次のステップ: ユーザー アクションを記録する

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。