Как определить, * какое * устройство Bluetooth вызывает трансляцию ACTION_ACL_CONNECTED? - PullRequest
8 голосов
/ 27 февраля 2012

Я хочу прослушивать соединение / разъединение с рядом определенных устройств Bluetooth, MAC-адреса которых я знаю, но которые не обязательно сопряжены (я не хочу связываться со списком сопряженных устройств пользователя и наоборот). Меня интересует только обнаружение их присутствия, а не общение с ними.

Это очень хорошо работает с моим кодом ниже! Но моя проблема в том, что я не могу узнать, какое конкретное устройство подключается / отключается, только что это происходит с кем-то из них. Как я могу узнать, к какому из действий относится действие?

Сначала я создаю экземпляры объектов для двух своих конкретных физических устройств Bluetooth и добавляю их в фильтр намерений:

    BluetoothDevice myPinkHeadset = mBluetoothAdapter.getRemoteDevice("18:17:0C:EB:9C:81");
    BluetoothDevice myPcBluetoothDongle = mBluetoothAdapter.getRemoteDevice("5A:7A:CC:4B:C5:08");

    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(myPinkHeadset.ACTION_ACL_CONNECTED);
    intentFilter.addAction(myPinkHeadset.ACTION_ACL_DISCONNECTED);
    intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_CONNECTED);
    intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_DISCONNECTED);

Тогда я слушаю передачи о них:

    final BroadcastReceiver intentReceiver = new BroadcastReceiver() {  
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

Теперь я хочу выяснить, какой из них был подключен и / или отключен, и я не вижу, как я могу это сделать.

Либо 1) Я использую "BluetoothDevice" напрямую. Он хорошо реагирует на трансляцию, но не говорит мне, к какому из двух физических устройств относится действие. Это их способ узнать? Bluetooth.getName () не разрешен, потому что это не статический класс.

if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { 
        } 

или 2) Я слушаю оба действия для обоих устройств.

        if (myPinkHeadset .ACTION_ACL_CONNECTED.equals(action)) {
            Log.v(TAG, "Connected to myPinkHeadset ");
        }
        else if (myPinkHeadset .ACTION_ACL_DISCONNECTED.equals(action)) {
            Log.v(TAG, "Disconnected from myPinkHeadset ");
        }
        else if (myPcBluetoothDongle .ACTION_ACL_CONNECTED.equals(action)) { 
            Log.v(TAG, "Connected to myPcBluetoothDongle ");
        }
        else if (myPcBluetoothDongle .ACTION_ACL_DISCONNECTED.equals(action)) {
            Log.v(TAG, "Disconnected from myPcBluetoothDongle ");

Но затем регистрируется, что он подключается к myPinkHeadset, даже если это myPvBluetoothDongle, который я активирую физически. Это всегда относится к тому, который идет первым из тестов if. Он заботится только о самом действии, а не о том, к какому объекту он относится.

Я видел, что EXTRA_DEVICE «используется как дополнительное поле Parcelable BluetoothDevice в каждом намерении, передаваемом этим классом». Но он возвращает мне только ноль:

String extra = intent.getStringExtra(BluetoothDevice.EXTRA_DEVICE);

Ответы [ 2 ]

15 голосов
/ 27 февраля 2012

Это дает устройство, подключенное к:

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

Будучи новичком, я неправильно понял концепцию посылки. EXTRA_DEVICE - это строка, но это просто тег для объекта. Поэтому нет необходимости регистрироваться или прослушивать отдельные экземпляры BluetoothDevice. Когда действие транслируется, намерение сообщит, какое физическое устройство вызвало его. (Могу ли я +1 себе за это :-D)

1 голос
/ 27 июля 2015
intentFilter.addAction(myPinkHeadset.ACTION_ACL_CONNECTED);
intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_CONNECTED);

и

intentFilter.addAction(myPinkHeadset.ACTION_ACL_DISCONNECTED);
intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_DISCONNECTED);

- это одно и то же значение.Это статическая ценность.BluetoothDevice.ACTION_ACL_CONNECTED и BluetoothDeviceACTION_ACL_DISCONNECTED

private void register() {
    context.registerReceiver(bluetoothBroadCast, new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED));
    context.registerReceiver(bluetoothBroadCast, new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED ));
}

private final BroadcastReceiver bluetoothBroadCast = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    switch (action) {
        case BluetoothDevice.ACTION_ACL_CONNECTED: {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            if(device.getAddress().equals(myPinkHeadset.getAddress)) {
                //Do what you want
            }
            break;
        }

        case BluetoothDevice.ACTION_ACL_DISCONNECTED: {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            break;
        }
    }
}

};

Надеюсь, это может помочь вам

...