type tutorial studio permiso low libreria developer bluetoothsocket android bluetooth android-broadcast android-bluetooth

tutorial - Captura de eventos bluetooth del receptor de difusión de Android



driver bluetooth android (2)

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

Primero, agregue el permiso de Bluetooth a su archivo AndroidManifest:

<uses-permission android:name="android.permission.BLUETOOTH" />

Cree un BroadcastReceiver en su 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 para Actividad / Servicio 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 cambios en la SCAN_MODE_NONE de detección del dispositivo ( SCAN_MODE_NONE , SCAN_MODE_CONNECTABLE , SCAN_MODE_CONNECTABLE_DISCOVERABLE ), cree otro BroadcastReceiver y regístrese / SCAN_MODE_CONNECTABLE_DISCOVERABLE registro de su actividad como mencioné anteriormente. La única diferencia entre esos BroadcastReceiver es que el primero usa BluetoothAdapter.EXTRA_STATE y el otro usa BluetoothAdapter.EXTRA_SCAN_MODE . Aquí está el código de ejemplo para BroadcastReceiver para detectar cambios de detección:

Cree un filtro y regístrelo 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 el BroadcastReciver en Actividad / Servicio para detectar los cambios de visibilidad:

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, por último, anular el registro en onDestroy() :

unregisterReceiver(mBroadcastReceiver2);

Tenga en cuenta que no necesita agregar ningún <intent-filter> o <receiver> a su archivo AndroidManifest, excepto que, por supuesto, debe agregar el permiso de Bluetooth.

Si desea capturar ( ACTION_ACL_CONNECTED , ACTION_ACL_DISCONNECTED , ACTION_ACL_DISCONNECT_REQUESTED ), ahora necesita agregar un <intent-filter> a su archivo AndroidManifest:

<intent-filter> <action android:name="android.bluetooth.device.action.ACL_CONNECTED" /> <action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" /> </intent-filter>

Cree un filtro y regístrelo 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 cree el BroadcastReceiver en su 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:

Cadena final estática pública EXTRA_STATE :

Usado como un campo extra int en ACTION_STATE_CHANGED intentos de solicitar el estado actual de energía. Los valores posibles son: STATE_OFF, STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF

Cadena final estática pública EXTRA_SCAN_MODE :

Se utiliza como un campo extra int en ACTION_SCAN_MODE_CHANGED para solicitar el modo de exploración actual. Los valores posibles son: SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE

Estoy tratando de detectar los cambios de estado de bluetooth con Broadcast Receiver.

Mi manifiesto:

<uses-permission android:name="android.permission.BLUETOOTH" /> <application> <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".BluetoothBroadcastReceiver" android:label="@string/app_name"> <intent-filter> <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" /> <action android:name="android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED" /> <action android:name="android.bluetooth.device.action.ACL_CONNECTED" /> <action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" /> </intent-filter> </receiver> </application>

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. Vaya a la configuración y encienda el bluetooth pero no pasa nada. Aunque espero mensajes de tostadas y logcat. ¿Qué pasa aquí?


Su problema principal;) No puede usar "cambiar" para comparar cadenas.

Al menos no hasta la VERSIÓN_INT 18 (inclusive). La versión 19 comenzó con Java 7.