【Android】蓝牙开发 - 0 开头的配对码显示不全,0 会被自动忽略

1,229 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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_PIN0 (0x00000000)
PAIRING_VARIANT_PASSKEY1 (0x00000001)
PAIRING_VARIANT_PASSKEY_CONFIRMATION2 (0x00000002)
PAIRING_VARIANT_DISPLAY_PIN3 (0x00000003)
PAIRING_VARIANT_DISPLAY_PASSKEY4 (0x00000004)
PAIRING_VARIANT_DISPLAY_PIN5 (0x00000005)
PAIRING_VARIANT_OOB_CONSENT6 (0x00000006)
PAIRING_VARIANT_PIN_16_DIGITS7 (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 开发工程师来做会怎么做呢?

最后,附上官方源码查看入口