蓝牙配对 - 如何显示简单的取消/配对对话框?

时间:2015-06-22 10:59:47

标签: android android-intent bluetooth android-bluetooth bluetooth-oob

我已在GitHub为此问题准备了a simple test project

我正在尝试创建一个Android应用,它可以从计算机屏幕扫描QR码,然后使用数据(MAC地址和PIN或哈希)进行 easy 配对(绑定)蓝牙设备。

与流行的InstaWifi app相似 - 但对于经典蓝牙。

出于测试目的,我还没有进行任何条形码扫描,只是显示设备列表:

list of devices

用户触摸其中一个设备后,在MainActivity.java中尝试配对:

private void startBluetoothPairing(BluetoothDevice device) {
    Intent pairingIntent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST);
    pairingIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
    pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
                BluetoothDevice.PAIRING_VARIANT_PIN);
    pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_KEY, 1234);
    //device.setPin(new byte[]{1,2,3,4});  <- DOES NOT CHANGE ANYTHING
    //device.setPairingConfirmation(false);
    startActivityForResult(pairingIntent, REQUEST_BT_SETTINGS);
}

不幸的是,弹出窗口仍然要求PIN:

pin dialog

因为我在源代码中实际指定了一个PIN,所以我实际上期望显示另一个更简单的系统对话框(这个在进行NFC OOB配对时显示):

pair dialog

从搜索解决方案来看,我知道有一种setPin()方法,但它在这里不适用(或者是它?) - 因为我试图将整个智能手机与蓝牙设备配对而不仅仅是应用...

我的问题:如何让Android操作系统显示简单的取消/配对对话框?

在GitHub上搜索Bluetooth pairing request字符串没有显示任何提示......

更新:关于unrealsoul007的建议(谢谢)我更新了MainActivity.java中的源代码,现在显示了简单的取消/配对对话框:

private void startBluetoothPairing(BluetoothDevice device) {
    Intent pairingIntent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST);
    pairingIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
    pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
        BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION);
    pairingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivityForResult(pairingIntent, REQUEST_BT_PAIRING);
}

但是我不确定如何完成配对过程 - 因为即使在对话框关闭之前onActivityResult也会调用resultCode=0

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    // this is called before user clicks Cancel or Pair in the dialog
    if (requestCode == REQUEST_BT_PAIRING) { 
        if (resultCode == Activity.RESULT_OK) {  // 0 != -1
            Log.d("XXX", "Let#s pair!!!!"); // NOT CALLED
        }

        return;
    }
}

1 个答案:

答案 0 :(得分:4)

系统会提示您输入图钉,因为这是您在pairingIntent中提出的要求。

而不是使用

pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
                BluetoothDevice.PAIRING_VARIANT_PIN);
pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_KEY, 1234);

使用

pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PASSKEY_CONFIRMATION);

如上所述here

  

将提示用户确认显示的密码   屏幕或应用程序将确认用户的密钥。