从广播接收器以编程方式连接 Android 中的蓝牙设备

Programmatically connect Bluetooth Device in Android from Broadcast Receiver

在我的广播接收器中,我检索到了绑定蓝牙设备的列表。

BluetoothStateChangedReceiver extends BroadcastReceiver

这是我获得配对设备的方式:

private void getPairedDevices(){
    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    if (pairedDevices == null || pairedDevices.size() == 0) {
        showToast("No Paired Devices Found");
    } else {
        ArrayList<BluetoothDevice> list = new ArrayList<BluetoothDevice>();
        list.addAll(pairedDevices);
        mPairedDeviceList = list;
    }
}

我调用这段代码:

BluetoothDevice device = mPairedDeviceList.get(0);
            deviceName = device.getName();

            if(device.getBondState()==device.BOND_BONDED){
                Log.d(TAG,"Device Name"+device.getName());
                BluetoothSocket mSocket= null;
                try {
                    mSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
                } catch (IOException e1) {
                    Log.d(TAG,"socket not created");
                    e1.printStackTrace();
                }
                try{
                    mSocket.connect();
                }
                catch(IOException e) {
                    try {
                        mSocket.close();
                        Log.d(TAG, "Cannot connect");
                    } catch (IOException e1) {
                        Log.d(TAG, "Socket not closed");
                        e1.printStackTrace();
                    }

                }

            }

我的 UUID 是

private static final UUID MY_UUID = UUID.fromString("DEADBEEF-0000-0000-0000-000000000000");

但是,我始终无法连接到设备?

我只是想在打开蓝牙后以编程方式连接到蓝牙扬声器。我错过了什么?

方法 createInsecureRfcommSocketToServiceRecord 在 Android 2.1 和 2.2 上有一些问题。以下代码在 catch 部分处理这些设备:

try {
        mBtSocket = btDevice
                .createRfcommSocketToServiceRecord(BT_SRVC_UUID);
        mBtSocket.connect(); 
    } catch (Exception e) {
        Log.e(TAG, "createInsecureRfcommSocket", e);
        Log.d(TAG, "trying with reflection");

        BluetoothDevice hxm = BluetoothAdapter.getDefaultAdapter()
                .getRemoteDevice(btDevice.getAddress());
        Method m;
        m = hxm.getClass().getMethod("createRfcommSocket",
                new Class[] { int.class });
        mBtSocket = (BluetoothSocket) m.invoke(hxm, Integer.valueOf(1));
        mBtSocket.connect();
    }

要获取 btDevice 和 BT_SRVC_UUID 我使用以下代码:

BluetoothDevice btDevice = BluetoothAdapter.getDefaultAdapter()
            .getRemoteDevice(macBtAddress);

最后,您应该始终确保设备没有运行 调用 connect() 时的设备发现。

mBluetoothAdapter.cancelDiscovery();

要获取设备的 macBTAddress,您可以使用 bluetoothAdapter 搜索设备并获取之前配对设备的 mac 地址。以后mac地址不会变,可以保存。

BT_SRV_UUID 是您的服务的 ID。您可以选择您喜欢的 UUID,只要确保它具有有效的语法(您可以使用我的代码中建议的那个)。