ekatz
ekatz

Reputation: 973

Bluetooth on Android - how to connect to the CORRECT bluetooth device?

I'm writing a program that speaks with an external accessory over rfcomm. My problem is that I don't know what the correct way of identifying my device is. the way I do it now is like this:

Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
                .getBondedDevices();
        for (BluetoothDevice device : pairedDevices) {
            if (device.getName().equals(MY_DEVICE_NAME)) {
                this.myDevice = device;
                break;
            }
        }

This method however relies on the name of the device which to me seems dirty and bad :) is there a better way to do this? I tried looking at all the methods of BluetoothDevice but none seemed to help - is the name really the best way to do it? I saw that in some places people say that I should use UUIDs but that is used to open the socket to the device once I have it:

            _socket = myDevice.createRfcommSocketToServiceRecord(MY_UUID);

is there a better way to do it?

Upvotes: 3

Views: 1498

Answers (3)

eriksoe
eriksoe

Reputation: 262

You can also use BluetoothDevice.getBluetoothClass() for at narrowing down which devices might be relevant.

BluetoothClass.getMajorDeviceClass() will tell you roughly what kind of device it is - a phone, a computer, an audio or video device, or whatever. BluetoothClass.hasService() further specifies some capabilities of the device.

Within each of the major classes, some minor classes are defined - what kind of computer / audio-video device / phone / health equipment etc. it is.

Also, on recent versions of the Android platform (API level 15+), you can query for the service records of a device, without having to connect to it. See BluetoothDevice.fetchUuidsWithSdp() and BluetoothDevice.getUuids().

Upvotes: 0

Jorge Silva
Jorge Silva

Reputation: 21

Devices of the same kind/functionality and/or brand will usually have a similar name. For example, all RN-41 devices from Roving Networks have the following name:

FireFly-XXXX

where XXXX is the last 4 digits of the device's address. That means you can use the following to connect to any of them:

        if (device.getName().startsWith("FireFly-")) {
            this.myDevice = device;
            break;
        }

This is exactly what I do in my app and haven't found any more reliable/consistent way to do it. As a generalization, you should be able to use a regular pattern if the name in the devices you are interested in is any more complex than the example above.

Upvotes: 1

Dennis Mathews
Dennis Mathews

Reputation: 6975

You can use myDevice.getAddress() to get the bluetooth device address and compare, it will always be unique (unlike name)

Upvotes: 0

Related Questions