Utilizzando il BluetoothAdapter
,
puoi trovare dispositivi Bluetooth remoti tramite il rilevamento dei dispositivi o tramite
l'elenco dei dispositivi accoppiati.
Assicurati di disporre delle autorizzazioni Bluetooth appropriate e configura l'app per il Bluetooth prima di tentare di trovare dispositivi Bluetooth.
Il rilevamento dei dispositivi è una procedura di scansione che cerca nella zona Dispositivi dotati di Bluetooth e richiede alcune informazioni su ciascuno di essi. Questo processo è a volte indicato come scoperta, ricerca o scansione. Un dispositivo Bluetooth nelle vicinanze risponde a una richiesta di rilevamento solo se che al momento accettano richieste di informazioni tramite l'individuazione. Se un dispositivo viene rilevabile, risponde alla richiesta di rilevamento condividendo alcune informazioni, come il nome, la classe e l'indirizzo MAC univoco del dispositivo. Utilizzo di questo informazioni, il dispositivo che esegue il processo di rilevamento può scegliere per avviare una connessione al dispositivo rilevato.
Poiché i dispositivi rilevabili potrebbero rivelare informazioni sulla posizione dell'utente, il processo di rilevamento del dispositivo richiede l'accesso alla posizione. Se la tua app è in uso su un dispositivo con Android 8.0 (livello API 26) o versioni successive, puoi utilizzare Gestione dispositivi associati API. Questa API esegue il rilevamento dei dispositivi per conto della tua app, pertanto l'app non deve richiedere le autorizzazioni di accesso alla posizione.
Dopo aver stabilito per la prima volta una connessione con un dispositivo remoto, di destinazione viene automaticamente presentata all'utente. Quando un dispositivo è accoppiato, informazioni di base sul dispositivo, ad esempio nome, classe e MAC di destinazione—viene salvato e può essere letto utilizzando le API Bluetooth. Con l'indirizzo MAC noto per un dispositivo remoto, è possibile avviare una connessione in qualsiasi momento senza eseguire il rilevamento, supponendo che il dispositivo sia ancora nel raggio d'azione.
Tieni presente che c'è una differenza tra l'accoppiamento e la connessione:
- Essere accoppiati significa che due dispositivi sono a conoscenza della loro esistenza. hanno una chiave di collegamento condivisa che può essere utilizzata per l'autenticazione e sono in grado stabilire una connessione criptata tra loro.
- Connessi significa che i dispositivi condividono attualmente un canale RFCOMM e sono in grado di trasmettere dati tra loro. Il Bluetooth attuale Le API richiedono l'accoppiamento dei dispositivi prima che sia possibile una connessione RFCOMM la creazione di un progetto. L'accoppiamento viene eseguito automaticamente quando avvii connessione con le API Bluetooth.
Le sezioni seguenti descrivono come trovare i dispositivi accoppiati e scoprire nuovi dispositivi con il rilevamento dei dispositivi.
Query sui dispositivi accoppiati
Prima di eseguire il rilevamento del dispositivo, vale la pena eseguire una query sul set di
per vedere se il dispositivo desiderato è già noto. A questo scopo, chiama
getBondedDevices()
Viene restituito un insieme
BluetoothDevice
oggetti
che rappresentano i dispositivi accoppiati. Ad esempio, puoi inviare query su tutti i dispositivi accoppiati e
Recuperare il nome e l'indirizzo MAC di ciascun dispositivo, come indicato nello snippet di codice
dimostra:
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 } }
Per avviare una connessione con un dispositivo Bluetooth, tutto ciò che è necessario dalla
associato all'oggetto BluetoothDevice
è l'indirizzo MAC, che puoi recuperare
chiamata
getAddress()
Tu
puoi scoprire di più sulla creazione di una connessione in Connettere il Bluetooth
dispositivi mobili.
Rilevamento dei dispositivi
Per iniziare a rilevare i dispositivi, chiama
startDiscovery()
Il processo è asincrono e restituisce un valore booleano che indica se
il rilevamento è stato avviato correttamente. Il processo di rilevamento di solito comporta
scansione di circa 12 secondi, seguita da una scansione delle pagine di ogni dispositivo trovato
per recuperare il nome Bluetooth.
Per ricevere informazioni su ogni dispositivo rilevato, la tua app deve registrare un
BroadcastReceiver
per
ACTION_FOUND
l'intento. Il sistema trasmette questo intent per ogni dispositivo. L'intent contiene
i campi aggiuntivi
EXTRA_DEVICE
e
EXTRA_CLASS
, che
a loro volta contengono un BluetoothDevice
e un
BluetoothClass
.
Il seguente snippet di codice mostra come registrarti per gestire la trasmissione
quando vengono rilevati i dispositivi:
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); }
Per avviare una connessione con un dispositivo Bluetooth, chiama il numero getAddress()
sul
BluetoothDevice
per recuperare l'indirizzo MAC associato.
Attiva la rilevabilità
Per rendere il dispositivo locale rilevabile da altri dispositivi, chiama
startActivityForResult(Intent, int)
con
ACTION_REQUEST_DISCOVERABLE
l'intento. Viene inviata una richiesta per attivare la modalità rilevabile del sistema senza
aprire l'app Impostazioni, l'operazione interromperà la tua app. Di
per impostazione predefinita, il dispositivo diventa rilevabile per due minuti. Puoi definire
durata diversa, fino a un'ora, aggiungendo
EXTRA_DISCOVERABLE_DURATION
extra.
Il seguente snippet di codice imposta il dispositivo in modo che sia rilevabile per cinque minuti:
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);
e
Figura 2: la finestra di dialogo per l'attivazione della rilevabilità.
Viene visualizzata una finestra di dialogo che richiede l'autorizzazione dell'utente per rendere il dispositivo
rilevabili, come mostrato nella figura 2. Se l'utente risponde "Consenti", quindi
il dispositivo diventa rilevabile per il periodo di tempo specificato. La tua attività quindi
riceve una chiamata
onActivityResult()
il callback, con il codice risultato uguale alla durata della
rilevabili. Se l'utente risponde "Rifiuta" o se si è verificato un errore, il risultato
il codice è RESULT_CANCELED
.
Il dispositivo rimane in modalità rilevabile per il tempo impostato. Per
una notifica quando la modalità rilevabile cambia, registra un BroadcastReceiver
per
ACTION_SCAN_MODE_CHANGED
l'intento. Questo intent contiene i campi aggiuntivi
EXTRA_SCAN_MODE
e
EXTRA_PREVIOUS_SCAN_MODE
,
che forniscono rispettivamente la nuova e la vecchia modalità di ricerca. I valori possibili per ogni
sono i seguenti:
SCAN_MODE_CONNECTABLE_DISCOVERABLE
- Il dispositivo è in modalità rilevabile.
SCAN_MODE_CONNECTABLE
- Il dispositivo non è in modalità rilevabile, ma può comunque ricevere connessioni.
SCAN_MODE_NONE
- Il dispositivo non si trova in modalità rilevabile e non può ricevere connessioni.
Se stai avviando la connessione a un dispositivo remoto, non è necessario attivare la rilevabilità del dispositivo. L'attivazione della rilevabilità è necessaria solo se vuoi che la tua app ospiti un socket del server che accetta i server poiché i dispositivi remoti devono poter rilevare altri dispositivi prima avviando connessioni a questi altri dispositivi.