Znajdź urządzenia Bluetooth

Za pomocą BluetoothAdapter, zdalne urządzenia Bluetooth można znaleźć, wykrywając urządzenia zapytanie o listę sparowanych urządzeń.

Upewnij się, że masz odpowiednie uprawnienia dotyczące Bluetootha. i skonfiguruj Bluetooth w aplikacji przed próbą znalezienia urządzeń Bluetooth.

Wykrywanie urządzeń to procedura skanowania, która polega na wyszukiwaniu w okolicy Urządzenia obsługujące Bluetooth i prosić o pewne informacje o każdym z nich. Ten proces jest czasami nazywany odkrywaniem, dopytywaniem lub skanowaniem. Urządzenie Bluetooth w pobliżu odpowiada na żądanie wykrywania tylko wtedy, gdy akceptuje obecnie żądania informacji, ponieważ jest wykrywalna. Jeśli urządzenie wykrywa, że odpowiada na żądanie wykrywania, udostępniając pewne informacje, takie jak nazwa urządzenia, jego klasa i unikalny adres MAC. Użycie tego urządzenie wykonujące proces wykrywania może wtedy wybrać, aby zainicjować połączenie z wykrytym urządzeniem.

Urządzenia wykrywalne mogą ujawniać informacje o lokalizacji użytkownika, proces wykrywania urządzenia wymaga dostępu do lokalizacji. Jeśli Twoja aplikacja jest używana na urządzeniu z Androidem 8.0 (poziom interfejsu API 26) lub nowszym, rozważ użycie Menedżer urządzeń towarzyszących API. Ten interfejs API wykrywa urządzenia w imieniu aplikacji, więc nie musi poprosić o dostęp do lokalizacji.

Przy pierwszym połączeniu z urządzeniem zdalnym parowanie jest automatycznie przedstawiane użytkownikowi. Po sparowaniu urządzenia podstawowych informacji o urządzeniu, takich jak nazwa, klasa i MAC urządzenia. – zostaje zapisany i można go odczytać przy użyciu interfejsów API Bluetooth. Używanie znanego adresu MAC dla urządzenia zdalnego, połączenie można z nim zainicjować w dowolnym momencie bez wykrywania, zakładając, że urządzenie pozostaje w zasięgu.

Pamiętaj, że istnieje różnica między sparowaniem a połączeniem:

  • Sparowanie oznacza, że 2 urządzenia mają świadomość swojego istnienia mają udostępniony klucz linku, którego można używać do uwierzytelniania nawiązanie szyfrowanego połączenia ze sobą.
  • Połączenie oznacza, że urządzenia mają obecnie wspólny kanał RFCOMM i mogą przesyłać dane między sobą. Obecny Bluetooth Aby możliwe było połączenie RFCOMM, interfejsy API wymagają sparowania urządzeń . Parowanie jest wykonywane automatycznie po zainicjowaniu zaszyfrowanego z interfejsami API Bluetooth.

W poniższych sekcjach opisano, jak znaleźć sparowane urządzenia Jak wykrywać nowe urządzenia, korzystając z funkcji wykrywania urządzeń.

Wyślij zapytanie do sparowanych urządzeń

Zanim przeprowadzisz wykrywanie urządzeń, warto sprawdzić, do których urządzeń, by sprawdzić, czy dane urządzenie jest już znane. Aby to zrobić, zadzwoń: getBondedDevices() Powoduje to zwrócenie zestawu BluetoothDevice obiektów reprezentują sparowane urządzenia. Możesz na przykład wysyłać zapytania dotyczące wszystkich sparowanych urządzeń i pobierz nazwę i adres MAC każdego urządzenia zgodnie z poniższym fragmentem kodu demonstruje:

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
   }
}

Aby zainicjować połączenie z urządzeniem Bluetooth, wystarczy użyć aplikacji powiązany obiekt BluetoothDevice to adres MAC pobierany przez połączenia getAddress() Ty Więcej informacji o tworzeniu połączenia znajdziesz w artykule Nawiązywanie połączeń Bluetooth urządzenia.

Wykrywanie urządzeń

Aby zacząć wykrywać urządzenia, zadzwoń pod numer startDiscovery() Proces jest asynchroniczny i zwraca wartość logiczną wskazującą, czy wykrywanie zostało rozpoczęte. Proces odkrywania zwykle obejmuje skanowanie zapytania trwało około 12 sekund, a następnie skanowanie stron każdego znalezionego urządzenia. aby pobrać jej nazwę Bluetooth.

Aby otrzymywać informacje o każdym wykrytym urządzeniu, aplikacja musi zarejestrować BroadcastReceiver dla wartości ACTION_FOUND intencji. System transmituje tę intencję w przypadku każdego urządzenia. Intencja zawiera te dodatkowe pola. EXTRA_DEVICE i EXTRA_CLASS, która z kolei zawierają BluetoothDevice i BluetoothClass. Ten fragment kodu pokazuje, jak zarejestrować się, aby mieć obsługę transmisji po wykryciu urządzeń:

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);
}

Aby zainicjować połączenie z urządzeniem Bluetooth, zadzwoń pod getAddress() BluetoothDevice, aby pobrać powiązany adres MAC.

Włącz wykrywalność

Aby urządzenie lokalne było wykrywalne dla innych urządzeń, wywołaj startActivityForResult(Intent, int) z ACTION_REQUEST_DISCOVERABLE intencji. Spowoduje to wysłanie prośby o włączenie trybu wykrywalnego systemu bez musisz przejść do aplikacji Ustawienia, co spowodowałoby zatrzymanie Twojej aplikacji. Według domyślnie urządzenie stanie się wykrywalne przez 2 minuty. Możesz zdefiniować o innym czasie trwania (do jednej godziny), dodając EXTRA_DISCOVERABLE_DURATION dodatkowe.

Ten fragment kodu ustawia urządzenie jako wykrywalne przez 5 minut:

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);


() Rysunek 2. Okno włączania wykrywalności

Pojawi się okno z prośbą o zgodę użytkownika na utworzenie urządzenia jak na ilustrację 2. Jeśli użytkownik odpowie „Zezwól”, potem stanie się wykrywalne przez określony czas. Twoja aktywność odbiera połączenie z onActivityResult() z kodem wyniku równym czasowi, przez jaki urządzenie wykrywalne. Jeśli użytkownik odpowiedział „Odmów” lub jeśli wystąpił błąd, kod to RESULT_CANCELED.

Urządzenie pozostaje w trybie wykrywalności przez przydzielony czas. Być powiadomienie o zmianie trybu wykrywalności zarejestruj BroadcastReceiver dla wartości ACTION_SCAN_MODE_CHANGED. intencji. Ta intencja zawiera dodatkowe pola EXTRA_SCAN_MODE oraz EXTRA_PREVIOUS_SCAN_MODE, które zapewniają odpowiednio nowy i stary tryb skanowania. Możliwe wartości są następujące:

SCAN_MODE_CONNECTABLE_DISCOVERABLE
Urządzenie jest w trybie wykrywalności.
SCAN_MODE_CONNECTABLE
Urządzenie nie jest w trybie wykrywalności, ale może nadal odbierać połączenia.
SCAN_MODE_NONE
Urządzenie nie jest w trybie wykrywalności i nie może odbierać połączeń.

Jeśli inicjujesz połączenie z urządzeniem zdalnym, nie musisz włącz wykrywalność urządzeń. Włączenie wykrywalności jest konieczne tylko wtedy, gdy chcesz, aby aplikacja hostowała gniazdo serwera, które akceptuje połączenia przychodzące ponieważ urządzenia zdalne muszą mieć możliwość wykrywania innych urządzeń, inicjowanie połączeń z tymi urządzeniami.