Mit dem BluetoothAdapter
können Sie Bluetooth-Geräte über die Geräteerkennung oder
die Liste der gekoppelten Geräte abfragen.
Prüfen Sie, ob Sie die erforderlichen Bluetooth-Berechtigungen haben. und richten Sie Ihre App für Bluetooth ein. bevor Sie versuchen, Bluetooth-Geräte zu finden.
Die Geräteerkennung ist ein Scanverfahren, bei dem in der Umgebung nach Bluetooth-fähigen Geräten und fordert Informationen zu jedem Gerät an. Dieses wird manchmal auch als Erkennen, Nachfragen oder Scannen bezeichnet. Ein Bluetooth-Gerät in der Nähe reagiert nur dann auf eine Erkennungsanfrage, wenn es Informationsanfragen derzeit akzeptiert, da sie auffindbar sind. Wenn ein Gerät sichtbar ist, reagiert er auf die Erkennungsanfrage mit Informationen, die er z. B. den Namen, die Klasse und die eindeutige MAC-Adresse des Geräts. Mit diesem kann das Gerät, das den Erkennungsprozess durchführt, um eine Verbindung zum erkannten Gerät herzustellen.
Da auf sichtbaren Geräten Informationen zum Standort des Nutzers offengelegt werden können, für die Geräteerkennung ist Zugriff auf den Standort erforderlich. Wenn deine App verwendet wird auf einem Gerät mit Android 8.0 (API-Level 26) oder höher kannst du die Begleitender Geräte-Manager API. Diese API führt im Namen Ihrer App eine Geräteerkennung aus, sodass Ihre App Berechtigungen zur Standortermittlung anfordern
Wenn zum ersten Mal eine Verbindung mit einem Remote-Gerät hergestellt wird, führt eine Kopplung über wird dem Nutzer automatisch angezeigt. Wenn ein Gerät gekoppelt ist, allgemeine Informationen über das Gerät, wie Name, Kursklasse und MAC-Adresse wird gespeichert und kann über die Bluetooth-APIs gelesen werden. Bekannte MAC-Adresse verwenden Adresse eines Remote-Geräts zu finden, kann jederzeit eine Verbindung damit hergestellt werden ohne eine Erkennung durchzuführen, vorausgesetzt, das Gerät befindet sich noch in Reichweite.
Beachten Sie, dass es einen Unterschied zwischen dem Koppeln und dem Verbinden gibt:
- Gekoppelt bedeutet, dass zwei Geräte erkennen, dass sie sich gegenseitig kennen, haben einen freigegebenen Linkschlüssel, der zur Authentifizierung verwendet werden kann und indem eine verschlüsselte Verbindung miteinander hergestellt wird.
- verbunden bedeutet, dass sich die Geräte derzeit einen RFCOMM-Kanal teilen und Daten untereinander übertragen können. Das aktuelle Bluetooth-Gerät Für APIs müssen Geräte gekoppelt sein, bevor eine RFCOMM-Verbindung hergestellt werden kann festgelegt ist. Die Kopplung wird automatisch durchgeführt, wenn Sie eine verschlüsselte Verbindung mit den Bluetooth-APIs.
In den folgenden Abschnitten wird beschrieben, wie Sie gekoppelte und wie Sie mithilfe der Geräteerkennung neue Geräte entdecken können.
Gekoppelte Geräte abfragen
Vor der Geräteerkennung empfiehlt es sich, die paar gekoppelten
Geräte, um zu sehen, ob das gewünschte Gerät bereits bekannt ist. Rufen Sie dazu unter
getBondedDevices()
Dies gibt eine Reihe von
BluetoothDevice
Objekte
für gekoppelte Geräte. Sie können beispielsweise alle gekoppelten Geräte und
den Namen und die MAC-Adresse jedes Geräts abrufen, wie im folgenden Code-Snippet
demonstriert:
Kotlin
val pairedDevices: Set<BluetoothDevice>? = bluetoothAdapter?.bondedDevices pairedDevices?.forEach { device -> val deviceName = device.name val deviceHardwareAddress = device.address // MAC address }
Java
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); if (pairedDevices.size() > 0) { // There are paired devices. Get the name and address of each paired device. for (BluetoothDevice device : pairedDevices) { String deviceName = device.getName(); String deviceHardwareAddress = device.getAddress(); // MAC address } }
Zum Herstellen einer Verbindung mit einem Bluetooth-Gerät benötigen Sie lediglich
verknüpftes BluetoothDevice
-Objekt ist die MAC-Adresse, die Sie durch
Anrufen
getAddress()
Ich
finden Sie unter Bluetooth verbinden
Geräte.
Geräte entdecken
Wenn du Geräte entdecken möchtest, rufe
startDiscovery()
Der Prozess ist asynchron und gibt einen booleschen Wert zurück, der angibt,
Erkennung wurde gestartet. Der Feststellungsprozess umfasst in der Regel
etwa 12 Sekunden dauernder Anfragescan, gefolgt von einem Seitenscan jedes gefundenen Geräts
um den Bluetooth-Namen abzurufen.
Um Informationen zu den gefundenen Geräten zu erhalten, muss deine App ein
BroadcastReceiver
für die
ACTION_FOUND
die Nutzerabsicht verstehen. Das System sendet diesen Intent an alle Geräte. Der Intent enthält
die zusätzlichen Felder
EXTRA_DEVICE
und
EXTRA_CLASS
, die
enthalten wiederum einen BluetoothDevice
und einen
BluetoothClass
.
Das folgende Code-Snippet zeigt, wie du dich für die Verarbeitung der Übertragung registrieren kannst.
wenn Geräte gefunden werden:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... // Register for broadcasts when a device is discovered. val filter = IntentFilter(BluetoothDevice.ACTION_FOUND) registerReceiver(receiver, filter) } // Create a BroadcastReceiver for ACTION_FOUND. private val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val action: String = intent.action when(action) { BluetoothDevice.ACTION_FOUND -> { // Discovery has found a device. Get the BluetoothDevice // object and its info from the Intent. val device: BluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) val deviceName = device.name val deviceHardwareAddress = device.address // MAC address } } } } override fun onDestroy() { super.onDestroy() ... // Don't forget to unregister the ACTION_FOUND receiver. unregisterReceiver(receiver) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { ... // Register for broadcasts when a device is discovered. IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(receiver, filter); } // Create a BroadcastReceiver for ACTION_FOUND. private final BroadcastReceiver receiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { // Discovery has found a device. Get the BluetoothDevice // object and its info from the Intent. BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); String deviceName = device.getName(); String deviceHardwareAddress = device.getAddress(); // MAC address } } }; @Override protected void onDestroy() { super.onDestroy(); ... // Don't forget to unregister the ACTION_FOUND receiver. unregisterReceiver(receiver); }
Um eine Verbindung mit einem Bluetooth-Gerät herzustellen, rufen Sie getAddress()
auf der
BluetoothDevice
, um die zugehörige MAC-Adresse abzurufen.
Sichtbarkeit aktivieren
Um das lokale Gerät für andere Geräte sichtbar zu machen, rufen Sie
startActivityForResult(Intent, int)
mit dem
ACTION_REQUEST_DISCOVERABLE
die Nutzerabsicht verstehen. Dadurch wird eine Anfrage zum Aktivieren des sichtbaren Modus des Systems gesendet, ohne dass
die App „Einstellungen“ öffnen, wodurch Ihre eigene App beendet wird. Von
ist das Gerät zwei Minuten lang sichtbar. Sie können eine
unterschiedlichen Zeitraum von bis zu einer Stunde, indem Sie
EXTRA_DISCOVERABLE_DURATION
extra.
Mit dem folgenden Code-Snippet wird festgelegt, dass das Gerät fünf Minuten lang sichtbar ist:
Kotlin
val requestCode = 1; val discoverableIntent: Intent = Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE).apply { putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300) } startActivityForResult(discoverableIntent, requestCode)
Java
int requestCode = 1; Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivityForResult(discoverableIntent, requestCode);
Abbildung 2:Dialogfeld zum Aktivieren der Sichtbarkeit.
Es wird ein Dialogfeld angezeigt, in dem der Nutzer um Erlaubnis gebeten wird, das Gerät
wie in Abbildung 2 dargestellt. Wenn der Nutzer
mit „Zulassen“ antwortet, dann die
Gerät für den angegebenen Zeitraum sichtbar ist. Ihre Aktivitäten zu diesem Zeitpunkt
erhält einen Anruf bei der
onActivityResult()
-Rückruf, wobei der Ergebniscode der Dauer entspricht, die das Gerät
sichtbar sind. Wenn der Nutzer mit „Ablehnen“ geantwortet hat oder ein Fehler aufgetreten ist, wird das Ergebnis
Der Code lautet RESULT_CANCELED
.
Das Gerät bleibt für die zugewiesene Zeit lautlos im Erkennungsmodus. To be
Benachrichtigungen erhalten, wenn sich der Modus „Sichtbar“ geändert hat, eine BroadcastReceiver
registrieren
für die
ACTION_SCAN_MODE_CHANGED
die Nutzerabsicht verstehen. Dieser Intent enthält die zusätzlichen Felder
EXTRA_SCAN_MODE
und
EXTRA_PREVIOUS_SCAN_MODE
,
mit dem neuen bzw. alten Scanmodus. Mögliche Werte für die einzelnen
sind folgende:
SCAN_MODE_CONNECTABLE_DISCOVERABLE
- Das Gerät befindet sich im Modus „Sichtbar“.
SCAN_MODE_CONNECTABLE
- Das Gerät befindet sich nicht im Modus „Sichtbar“, kann aber Verbindungen herstellen.
SCAN_MODE_NONE
- Das Gerät befindet sich nicht im sichtbaren Modus und kann keine Verbindungen herstellen.
Wenn Sie die Verbindung zu einem Remote-Gerät herstellen, müssen Sie nicht die Gerätesichtbarkeit zu aktivieren. Die Sichtbarkeit muss nur aktiviert werden, wenn Ihre App einen Server-Socket hosten soll, der eingehende da Remote-Geräte andere Geräte erkennen können, dem Herstellen von Verbindungen zu diesen anderen Geräten.