快速配对配套应用集成

快速配对功能可将 OEM 配套应用深度集成到配对和使用体验中。在完成快速配对后,您可以选择利用多个集成点来吸引用户。

在开箱体验 (OOBE) 期间安装

借助快速配对功能,用户可以下载耳机的配套应用,作为开箱体验 (OOBE) 的最后一步。在通知中向用户显示这一信息,告知他们配对已完成,可以下载应用(如果尚未安装),也可以打开应用并开始使用。

如需开始使用此功能,请将配套应用的软件包名称添加到控制台上的设备详细信息中。

通过快速配对启动的配套应用包含一个额外的数据元素:

  • android.bluetooth.device.extra.DEVICE - 触发通知的蓝牙设备

设置切片集成

Slice 可由配套应用提供,以进一步增强设备的“蓝牙设置”页面上提供的选项。

必须由配套应用实现 SliceProvider 才能提供这些设置 Slice。可用的 Slice 有两种类型:OOBE 切片和通用设置项。如果用户尚未在配套应用中配置耳机,则应包含 OOBE 切片,并且应始终包含其余 Slice,请参阅下面的代码示例:

@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 用于提醒用户完成其设备的设置(如果用户尚未在配套应用中完成此操作)。用户完成设备设置后,配套应用不得再次提供 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 后,将以下代码添加到控制台,以便快速配对服务验证其是否与正确的应用通信:

固件更新 intent

如果已连接设备的固件版本过旧,或者所说的固件版本与设备控制台中配置的固件版本完全不同,快速配对将在检查固件版本后通过 com.google.android.gms.nearby.fastpair.ACTION_FIRMWARE_UPDATE_BROADCAST intent 通知配套应用。Intent 包含以下额外信息:

  • com.google.android.gms.nearby.fastpair.EXTRA_LOCAL_FIRMWARE_VERSION,已连接设备的固件版本
  • com.google.android.gms.nearby.fastpair.EXTRA_UPDATE_NOTIFICATION_SHOWN,如果快速配对已显示通知,则设为 true