Fügen Sie Ihrem AndroidManifest eine Bluetooth-Berechtigung hinzu.
<uses-permission android:name="android.permission.BLUETOOTH" />
Dann nutzen Absicht Filter die hören ACTION_ACL_CONNECTED
, ACTION_ACL_DISCONNECT_REQUESTED
und ACTION_ACL_DISCONNECTED
Sendungen:
public void onCreate() {
...
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
this.registerReceiver(mReceiver, filter);
}
//The BroadcastReceiver that listens for bluetooth broadcasts
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
... //Device found
}
else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
... //Device is now connected
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
... //Done searching
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
... //Device is about to disconnect
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
... //Device has disconnected
}
}
};
Ein paar Anmerkungen:
- Es gibt keine Möglichkeit, beim Start der Anwendung eine Liste der verbundenen Geräte abzurufen. Mit der Bluetooth-API können Sie keine Abfragen durchführen, sondern Änderungen ändern.
- Eine schwierige Lösung für das oben genannte Problem wäre, die Liste aller bekannten / gekoppelten Geräte abzurufen ... und dann zu versuchen, eine Verbindung zu jedem herzustellen (um festzustellen, ob Sie verbunden sind).
- Alternativ können Sie die Bluetooth-API von einem Hintergrunddienst überwachen lassen und die Gerätezustände auf die Festplatte schreiben, damit Ihre Anwendung sie zu einem späteren Zeitpunkt verwenden kann.
In meinem Anwendungsfall wollte ich nur sehen, ob ein Bluetooth-Headset für eine VoIP-App verbunden ist. Die folgende Lösung hat bei mir funktioniert:
Natürlich benötigen Sie die Bluetooth-Berechtigung:
quelle
Vielen Dank an Skylarsutton für seine Antwort. Ich poste dies als Antwort auf seine, aber da ich Code poste, kann ich nicht als Kommentar antworten. Ich habe seine Antwort bereits positiv bewertet und suche daher keine Punkte. Einfach vorwärts zahlen.
Aus irgendeinem Grund konnte BluetoothAdapter.ACTION_ACL_CONNECTED von Android Studio nicht aufgelöst werden. Vielleicht war es in Android 4.2.2 veraltet? Hier ist eine Modifikation seines Codes. Der Registrierungscode ist der gleiche. Der Empfängercode unterscheidet sich geringfügig. Ich verwende dies in einem Dienst, der ein Bluetooth-verbundenes Flag aktualisiert, auf das andere Teile der App verweisen.
quelle
In der BluetoothDevice-System-API unter https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java gibt es eine isConnected- Funktion
Wenn Sie wissen möchten, ob ein begrenztes (gekoppeltes) Gerät derzeit angeschlossen ist oder nicht, funktioniert die folgende Funktion für mich einwandfrei:
quelle
bluetoothManager.getConnectionState(device, BluetoothProfile.GATT) == BluetoothProfile.STATE_CONNECTED
?val m: Method = device.javaClass.getMethod("isConnected")
und sindval connected = m.invoke(device)
.fun isConnected(device: BluetoothDevice): Boolean { return try { val m: Method = device.javaClass.getMethod( "isConnected" ) m.invoke(device) as Boolean } catch (e: Exception) { throw IllegalStateException(e) } }
Dieser Code gilt für die Headset-Profile. Wahrscheinlich funktioniert er auch für andere Profile. Zuerst müssen Sie den Profil-Listener (Kotlin-Code) bereitstellen:
Dann beim Überprüfen von Bluetooth:
Es dauert einige Zeit, bis onSeviceConnected aufgerufen wird. Danach erhalten Sie möglicherweise eine Liste der angeschlossenen Headset-Geräte von:
quelle
BluetoothAdapter.getDefaultAdapter().isEnabled
-> gibt true zurück, wenn Bluetooth geöffnet istval audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.isBluetoothScoOn
-> gibt true zurück, wenn das Gerät angeschlossen istquelle
Ich habe wirklich nach einer Möglichkeit gesucht, den Verbindungsstatus eines Geräts abzurufen und keine Verbindungsereignisse abzuhören. Folgendes hat bei mir funktioniert:
quelle