Bluetooth-Geräte suchen

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.