继续创作,加速成长!这是我参与「日新方案 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 开发工程师来做会怎么做呢?
最后,附上官方源码检查进口