Trovare dispositivi Bluetooth

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.