继续创作,加速成长!这是我参与「日新方案 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 开发工程师来做会怎么做呢?

最后,附上官方源码检查进口