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.