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.