快速配对功能可将 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
后,将以下代码添加到控制台,以便快速配对服务验证其是否与正确的应用通信:
- 提供方的授权
- 配套应用的公开签名
SHA-256
摘要- 您可以使用 apksigner 获取 SHA-256 摘要。
固件更新 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