ファスト ペアリング コンパニオン アプリの統合

ファスト ペアリングにより、OEM のコンパニオン アプリをペア設定と使用エクスペリエンスに緊密に統合できます。ファスト ペアリングの完了後にユーザーに働きかけるために、任意で利用できる統合ポイントが複数あります。

Out-Of-Box Experience(OOBE)中のインストール

ファスト ペアリングを使用すると、ユーザーは Out-Of-Box Experience(OOBE)の最後の手順としてヘッドセットのコンパニオン アプリをダウンロードできます。これは、ペア設定が完了したことと、アプリがまだインストールされていない場合はダウンロードするか、アプリを開いて使用を開始できることを示す通知でユーザーに表示されます。

この機能を利用するには、コンソールでデバイスの詳細にコンパニオン アプリのパッケージ名を追加します。

ファスト ペアリングによって起動されるコンパニオン アプリには、次のような追加のデータ要素が含まれます。

設定スライスの統合

Slice はコンパニオン アプリから提供され、デバイスの Bluetooth 設定ページで利用可能なオプションをさらに拡張できます。

これらの設定スライスを提供するには、コンパニオン アプリで SliceProvider を実装する必要があります。利用可能なスライスには、OOBE スライスと汎用設定項目の 2 種類があります。ユーザーがコンパニオン アプリ内でヘッドセットをまだ構成しておらず、残りのスライスを常に含める必要がある場合は、OOBE スライスを含める必要があります。次のコードサンプルを参照してください。

@Nullable
@Override
public Slice onBindSlice(Uri sliceUri) {
  String address = sliceUri.getQueryParameter("addr");
  if (address == null) {
    return null;
  }
  String path = sliceUri.getPathSegments().get(/* index= */ 0);
  if ("settings_slice".equals(path)) {
    return createSettingSlice(sliceUri, address);
  } else if ("oobe_slice".equals(path)) {
    return createOobeReminderSlice(sliceUri, address);
  }
  return null;
}

oobe_slice は、ユーザーがコンパニオン アプリでデバイスのセットアップを完了していない場合に、そのセットアップを完了するようユーザーに通知するために使用されます。ユーザーがデバイスのセットアップを完了した後に、コンパニオン アプリはスライスを再度提供してはなりません。

@Nullable
private Slice createOobeReminderSlice(Uri sliceUri, String address) {
  if (!deviceHasGoneThroughOobe(address)) {
    ListBuilder listBuilder =
        new ListBuilder(context, sliceUri, ListBuilder.INFINITY);
    addOobeSlice(listBuilder, context, address);
    return listBuilder.build();
  }
  return null;
}

private static void addOobeSlice(
    ListBuilder listBuilder, Context context, String address) {
  listBuilder.addRow(
      createRow(
          context,
          R.drawable.icon_oobe,
          R.string.title_oobe,
          R.string.summary_oobe,
          R.string.label_oobe,
          createOobePendingIntent(context, address)));
}

setting_slice は、コンパニオン アプリがよく使用される設定へのリンクを提供できる場所です。

private Slice createSettingSlice(Uri sliceUri, String address) {
  ListBuilder listBuilder =
      new ListBuilder(context, sliceUri, ListBuilder.INFINITY);
  // TODO: Add your customized slice here.
  addRow1(listBuilder, context, address);
  addRow2(listBuilder, context, address);
  return listBuilder.build();
}

private static void addRow1(
    ListBuilder listBuilder, Context context, String address) {
  listBuilder.addRow(
      createRow(
          context,
          R.drawable.fp_slice_row1_icon,
          R.string.fp_slice_row1_title_gestures,
          R.string.fp_slice_row1_summary_gestures,
          R.string.fp_slice_row1_label_gestures,
          createPendingIntent(context, address)));
}

private static void addRow2(
    ListBuilder listBuilder, Context context, String address) {
  ...
}

各 Slice には、タイトル、サブタイトル、アイコン、アクションが必要です。

private static RowBuilder createRow(
    Context context,
    @DrawableRes int iconId,
    @StringRes int titleId,
    @StringRes int summaryId,
    @StringRes int actionTitleId,
    PendingIntent pendingIntent) {
  SliceAction action =
      SliceAction.createDeeplink(
          pendingIntent,
          IconCompat.createWithResource(context, iconId),
          ListBuilder.ICON_IMAGE,
          context.getString(actionTitleId));
  return new RowBuilder()
      .setTitleItem(
          IconCompat.createWithResource(context, iconId),
          ListBuilder.ICON_IMAGE)
      .setTitle(context.getString(titleId))
      .setSubtitle(context.getString(summaryId))
      .setPrimaryAction(action);
}

SliceProvider を実装した後、以下をコンソールに追加して、ファスト ペアリング サービスが正しいアプリと通信していることを検証できるようにします。

ファームウェア更新インテント

接続済みデバイスのファームウェア バージョンが最新でない場合、またはデバイスのコンソールで設定されているファームウェア バージョンと正確に異なる場合は、ファームウェア バージョンの確認後に、ファスト ペアリングにより com.google.android.gms.nearby.fastpair.ACTION_FIRMWARE_UPDATE_BROADCAST インテントでコンパニオン アプリに通知します。このインテントには、次のような追加情報があります。

  • com.google.android.gms.nearby.fastpair.EXTRA_LOCAL_FIRMWARE_VERSION: 接続済みデバイスのファームウェア バージョン
  • com.google.android.gms.nearby.fastpair.EXTRA_UPDATE_NOTIFICATION_SHOWN、ファスト ペアリングによって通知が表示された場合は true に設定されます。