2012-02-27 12 views
8

Quiero escuchar la conexión/desconexión con un número de dispositivos Bluetooth específicos cuyas direcciones MAC conozco, pero que no están necesariamente emparejadas (no quiero meterme con la lista de dispositivos emparejados del usuario y viceversa). Solo me interesa descubrir su presencia, no comunicarme con ellos.¿Cómo se identifica * qué * dispositivo bluetooth provoca una transmisión ACTION_ACL_CONNECTED?

¡Esto funciona muy bien con mi código a continuación! Pero mi problema es que no puedo descubrir qué dispositivo específico se está conectando/desconectando, solo que le sucede a alguno de ellos. ¿Cómo puedo averiguar cuál concierne la acción?

Primero instancias de objetos para mis dos dispositivos específicos bluetooth física y añadirlos a mi filtro intención:

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); 

Entonces escucha para las emisiones de ellos:

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

Ahora quiero encontrar cuál ha sido conectado y/o desconectado, y no veo cómo puedo hacerlo.

O bien 1) Uso "BluetoothDevice" directamente. Reacciona bien a la transmisión, pero no me dice cuál de los dos dispositivos físicos afecta la acción. ¿Es una manera de averiguarlo? Bluetooth.getName() no está permitido porque no es una clase estática.

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

o 2) Escucho las dos acciones para ambos dispositivos.

 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 "); 

Pero entonces se registra que conecta con myPinkHeadset incluso si es myPvBluetoothDongle Cómo activo físicamente. Siempre va para el que viene primero de las pruebas if. Solo se preocupa por la acción en sí, no por el objeto al que se refiere.

Vi que EXTRA_DEVICE es "Utilizado como un campo extra de BluetoothDeparible Parcelable en cada intento transmitido por esta clase". Pero sólo se devuelve un valor nulo a mí:

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

Respuesta

14

Esto le da al dispositivo conectado a:

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

Como novato, no he entendido bien el concepto parcelable. EXTRA_DEVICE es una Cadena, pero es solo una etiqueta para el objeto. Por lo tanto, no es necesario registrarse o escuchar instancias individuales de BluetoothDevice. Cuando se transmite una acción, la intención indicará qué dispositivo físico la causó. (¿Puedo +1 a mí mismo para este :-D)

+0

cometido el mismo error con el parcelable, la cadena es confuso – NikkyD

1
intentFilter.addAction(myPinkHeadset.ACTION_ACL_CONNECTED); 
intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_CONNECTED); 

y

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

son el mismo valor. Es un valor estático. BluetoothDevice.ACTION_ACL_CONNECTED y 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; 
     } 
    } 
} 

};

espero que esto le puede ayudar a

Cuestiones relacionadas