Android Broadcast Receiver bluetooth events catching

Estoy tratando de ver los cambios de estado del bluetooth con Broadcast Receiver.

Mi manifiesto:

                 

Receptor en método de onReceive :

 public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.d("BroadcastActions", "Action "+action+"received"); int state; BluetoothDevice bluetoothDevice; switch(action) { case BluetoothAdapter.ACTION_STATE_CHANGED: state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1); if (state == BluetoothAdapter.STATE_OFF) { Toast.makeText(context, "Bluetooth is off", Toast.LENGTH_SHORT).show(); Log.d("BroadcastActions", "Bluetooth is off"); } else if (state == BluetoothAdapter.STATE_TURNING_OFF) { Toast.makeText(context, "Bluetooth is turning off", Toast.LENGTH_SHORT).show(); Log.d("BroadcastActions", "Bluetooth is turning off"); } else if(state == BluetoothAdapter.STATE_ON) { Log.d("BroadcastActions", "Bluetooth is on"); } break; case BluetoothDevice.ACTION_ACL_CONNECTED: bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Toast.makeText(context, "Connected to "+bluetoothDevice.getName(), Toast.LENGTH_SHORT).show(); Log.d("BroadcastActions", "Connected to "+bluetoothDevice.getName()); break; case BluetoothDevice.ACTION_ACL_DISCONNECTED: bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Toast.makeText(context, "Disconnected from "+bluetoothDevice.getName(), Toast.LENGTH_SHORT).show(); break; } } 

Lanzo la aplicación y luego la minimizo presionando el botón de Inicio. Ve a la configuración y activa bluetooth, pero no pasa nada. Aunque espero tostadas y mensajes de logcat. ¿Qué pasa aquí?

Para detectar los cambios de estado de Bluetooth ( STATE_OFF , STATE_TURNING_ON , STATE_ON , STATE_TURNING_OFF ), haga esto en su Actividad:

Primero, agrega el permiso de Bluetooth a tu archivo AndroidManifest:

  

Crea un BroadcastReceiver en tu actividad o servicio:

  private final BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); switch(state) { case BluetoothAdapter.STATE_OFF: .. break; case BluetoothAdapter.STATE_TURNING_OFF: .. break; case BluetoothAdapter.STATE_ON: .. break; case BluetoothAdapter.STATE_TURNING_ON: .. break; } } } }; 

Cree un IntentFilter y regístrelo con BroadcastReceiver en Activity / Service en su método onCreate() :

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); IntentFilter filter1 = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver(mBroadcastReceiver1, filter1); ... } 

onDestroy() registro de BroadcastReceiver en su método onDestroy() :

 @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mBroadcastReceiver1); } 

Para detectar los cambios de la SCAN_MODE_NONE del dispositivo ( SCAN_MODE_NONE , SCAN_MODE_CONNECTABLE , SCAN_MODE_CONNECTABLE_DISCOVERABLE ), cree otro BroadcastReceiver y registre / SCAN_MODE_CONNECTABLE_DISCOVERABLE registro de su actividad como mencioné anteriormente. La única diferencia entre esos BroadcastReceiver es el primero que usa BluetoothAdapter.EXTRA_STATE y el otro usa BluetoothAdapter.EXTRA_SCAN_MODE . Aquí está el código de ejemplo de BroadcastReceiver para detectar cambios de descubrimiento:

Crear filtro y registrarlo en el método onCreate() :

 IntentFilter filter2 = new IntentFilter(); filter2.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); filter2.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); filter2.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED); registerReceiver(mBroadcastReceiver2, filter2); 

Cree BroadcastReciver en Actividad / Servicio para detectar cambios de descubrimiento:

  private final BroadcastReceiver mBroadcastReceiver2 = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if(action.equals(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED)) { int mode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, BluetoothAdapter.ERROR); switch(mode){ case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE: .. break; case BluetoothAdapter.SCAN_MODE_CONNECTABLE: .. break; case BluetoothAdapter.SCAN_MODE_NONE: .. break; } } } }; 

Y finalmente anular el registro en onDestroy() :

 unregisterReceiver(mBroadcastReceiver2); 

Tenga en cuenta que no necesita agregar ningún o a su archivo AndroidManifest, excepto que necesita agregar el permiso de Bluetooth, por supuesto.

Si quiere atrapar ( ACTION_ACL_CONNECTED , ACTION_ACL_DISCONNECTED , ACTION_ACL_DISCONNECT_REQUESTED ), ahora necesita agregar un a su archivo AndroidManifest:

     

Crear filtro y registrarlo en el método onCreate() :

 IntentFilter filter3 = new IntentFilter(); filter3.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); filter3.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); registerReceiver(mBroadcastReceiver3, filter3); 

Luego crea el BroadcastReceiver en tu actividad / servicio:

  private final BroadcastReceiver mBroadcastReceiver3 = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); switch (action){ case BluetoothDevice.ACTION_ACL_CONNECTED: .. break; case BluetoothDevice.ACTION_ACL_DISCONNECTED: .. break; } } }; 

Y, por último, anular el registro:

 unregisterReceiver(mBroadcastReceiver3); 

Si desea leer más sobre las constantes de estado, esto es de la documentación:

public static final String EXTRA_STATE :

Se utiliza como un campo extra adicional en ACTION_STATE_CHANGED para solicitar el estado de energía actual. Los valores posibles son: STATE_OFF, STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF

public static final String EXTRA_SCAN_MODE :

Se usa como un campo extra adicional en ACTION_SCAN_MODE_CHANGED para solicitar el modo de escaneo actual. Los valores posibles son: SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE

Tu problema principal;) No puedes usar “cambiar” para comparar cuerdas.

Al menos no hasta VERSION_INT 18 (inclusive). La versión 19 comenzó con Java 7.