Ich versuche, Bluetooth-Statusänderungen mit dem Broadcast-Receiver zu erkennen.
Mein Manifest:
<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>
Empfänger onReceive
Methode:
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;
}
}
Ich starte die App und minimiere sie durch Drücken der Home-Taste. Gehen Sie zu den Einstellungen und aktivieren Sie Bluetooth, aber es passiert nichts. Ich erwarte jedoch Toast- und Logcat-Nachrichten. Was ist hier los?
Um Bluetooth-Statusänderungen zu erfassen (STATE_OFF
, STATE_TURNING_ON
, STATE_ON
, STATE_TURNING_OFF
), führen Sie dies in Ihrer Aktivität aus:
Fügen Sie Ihrer AndroidManifest-Datei zunächst die Bluetooth-Berechtigung hinzu:
<uses-permission Android:name="Android.permission.BLUETOOTH" />
Erstellen Sie einen BroadcastReceiver in Ihrer Aktivität oder in Ihrem Dienst:
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;
}
}
}
};
Erstellen Sie einen IntentFilter und registrieren Sie ihn bei BroadcastReceiver bei Activity/Service in Ihrer onCreate()
-Methode:
@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);
...
}
Heben Sie die Registrierung von BroadcastReceiver in Ihrer onDestroy()
-Methode auf:
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mBroadcastReceiver1);
}
Um Änderungen an der Erkennbarkeit des Geräts (SCAN_MODE_NONE
, SCAN_MODE_CONNECTABLE
, SCAN_MODE_CONNECTABLE_DISCOVERABLE
) festzustellen, erstellen Sie einen weiteren BroadcastReceiver und registrieren/entfernen Sie Ihre Aktivität wie oben erwähnt. Der einzige Unterschied zwischen diesen BroadcastReceivers ist, dass zuerst BluetoothAdapter.EXTRA_STATE
und der andere BluetoothAdapter.EXTRA_SCAN_MODE
verwendet wird. Hier ist der Beispielcode für BroadcastReceiver, um Erkennbarkeitsänderungen abzufangen:
Erstellen Sie einen Filter und registrieren Sie ihn in der onCreate()
-Methode:
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);
Erstellen Sie den BroadcastReciver in Activity/Service, um Änderungen der Erkennbarkeit zu erfassen:
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;
}
}
}
};
Und schließlich die Registrierung in onDestroy()
aufheben:
unregisterReceiver(mBroadcastReceiver2);
Beachten Sie, dass Sie Ihrer AndroidManifest-Datei keinen <intent-filter>
oder <receiver>
hinzufügen müssen, es sei denn, Sie müssen natürlich die Bluetooth-Berechtigung hinzufügen.
Wenn Sie fangen möchten (ACTION_ACL_CONNECTED
, ACTION_ACL_DISCONNECTED
, ACTION_ACL_DISCONNECT_REQUESTED
), müssen Sie jetzt einen <intent-filter>
zu Ihrer AndroidManifest-Datei hinzufügen:
<intent-filter>
<action Android:name="Android.bluetooth.device.action.ACL_CONNECTED" />
<action Android:name="Android.bluetooth.device.action.ACL_DISCONNECTED" />
</intent-filter>
Erstellen Sie einen Filter und registrieren Sie ihn in der onCreate()
-Methode:
IntentFilter filter3 = new IntentFilter();
filter3.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter3.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
registerReceiver(mBroadcastReceiver3, filter3);
Dann erstellen Sie den BroadcastReceiver in Ihrer Activity/Service:
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;
}
}
};
Und schließlich die Registrierung aufheben:
unregisterReceiver(mBroadcastReceiver3);
Wenn Sie mehr über Zustandskonstanten lesen möchten, finden Sie dies in der Dokumentation:
public static final String EXTRA_STATE :
Wird als zusätzliches int-Feld in ACTION_STATE_CHANGED verwendet, um die Anforderung von .__ anzufordern. der aktuelle Leistungszustand. Mögliche Werte sind: STATE_OFF, STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF
public static final String EXTRA_SCAN_MODE :
Wird als zusätzliches Feld in ACTION_SCAN_MODE_CHANGED für .__ verwendet. den aktuellen Scan-Modus anfordern. Mögliche Werte sind: SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE
Ihr Hauptproblem;) Sie können "switch" nicht für den Stringvergleich verwenden.
Zumindest nicht vor VERSION_INT 18 (inklusive). Version 19 wurde mit Java 7 gestartet.