持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 1 天,点击查看活动详情
00、前言
最近在做车机蓝牙的开发,在实现连接配对的时候,有时候拿到的配对码只有 5 位,可是手机上显示的是 6 位。经测试发现只要是 0 开头的配对码,那么无论前面有多少个 0 都会不展示。那么本篇文章主要分享一下蓝牙配对类型,以及这个问题的解决。
01、蓝牙配对类型
通过对源码的分析,通过 intent.getIntentExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT) 的方式获取到蓝牙配对类型。
//通过下面的代码,可以获取到配对的方式和 pin 码
int type = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,BluetoothDevice.ERROR);
总共有以下 8 种类型
| 变量名 | 值 |
|---|---|
| PAIRING_VARIANT_PIN | 0 (0x00000000) |
| PAIRING_VARIANT_PASSKEY | 1 (0x00000001) |
| PAIRING_VARIANT_PASSKEY_CONFIRMATION | 2 (0x00000002) |
| PAIRING_VARIANT_DISPLAY_PIN | 3 (0x00000003) |
| PAIRING_VARIANT_DISPLAY_PASSKEY | 4 (0x00000004) |
| PAIRING_VARIANT_DISPLAY_PIN | 5 (0x00000005) |
| PAIRING_VARIANT_OOB_CONSENT | 6 (0x00000006) |
| PAIRING_VARIANT_PIN_16_DIGITS | 7 (0x00000007) |
看看车机源码中,官方是如何处理这些不同类型的。
//packages/apps/Car/Settings/src/com/android/car/settings/bluetooth/BluetoothPairingController.java
public int getDialogType() {
switch (mType) {
case BluetoothDevice.PAIRING_VARIANT_PIN:
case BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS:
case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
return USER_ENTRY_DIALOG;
case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
case BluetoothDevice.PAIRING_VARIANT_CONSENT:
case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
return CONFIRMATION_DIALOG;
case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
return DISPLAY_PASSKEY_DIALOG;
default:
return INVALID_DIALOG_TYPE;
}
}
//packages/apps/Car/Settings/src/com/android/car/settings/bluetooth/BluetoothPairingDialogFragment.java
private AlertDialog setupDialog() {
AlertDialog dialog; switch (mPairingController.getDialogType()) {
case BluetoothPairingController.USER_ENTRY_DIALOG:
dialog = createUserEntryDialog();
break;
case BluetoothPairingController.CONFIRMATION_DIALOG:
dialog = createConsentDialog();
break;
case BluetoothPairingController.DISPLAY_PASSKEY_DIALOG:
dialog = createDisplayPasskeyOrPinDialog();
break;
default:
dialog = null;
LOG.e("Incorrect pairing type received, not showing any dialog");
}
return dialog;
}
通过上面两段代码,我们可以看出在应用层面,源码将其分为 3 种类型来处理。
-
createUserEntryDialog在这种情况下,就需要用户输入手机端上显示的配对码。 -
createConsentDialog在这种情况下,只需要用户对配对码进行确认即可。 -
createDisplayPasskeyOrPinDialog在这种情况下,只向用户展示密码或配对码。
02、解决方案
开头的问题,发生在上面的第二种情况下,只需要拥堵对配对码进行确认即可。我们通过下面的代码获取到配对码
int pinKey = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_KEY, BluetoothDevice.ERROR);
因为获取到的结果是 int,所以会自动消除前面的 0 。查看官方源码,发现是通过下面的方式进行处理即可。
String strPinKey = String.format(Locale.US,"%06d", pinKey);
03、结语
通过这次问题的解决,让我意识到源码具有非常好的参考作用。当我们遇到开发问题的时候,可以像偶像的力量一样,即当我们遇到了问题的时候,想想如果是我们的榜样会怎么做呢?在这里就是,如果是 Google 开发工程师来做会怎么做呢?
最后,附上官方源码查看入口