Avec BluetoothAdapter
,
vous pouvez trouver des appareils Bluetooth distants
grâce à la détection d'appareils ou en
interrogeant la liste des appareils associés.
Assurez-vous de disposer des autorisations Bluetooth appropriées. et configurez votre application pour le Bluetooth. avant d'essayer de trouver des appareils Bluetooth.
La détection d'appareils est une procédure d'analyse qui recherche dans la région appareils sur lesquels le Bluetooth est activé et demande des informations à leur sujet. Ce processus est parfois appelé découverte, demande ou analyse. Un appareil Bluetooth à proximité ne répond à une requête de détection que s'il est acceptent actuellement les demandes d'informations en étant visible. Si un appareil est visible, il répond à la requête de découverte en partageant certaines informations, telles que le nom de l'appareil, sa classe et son adresse MAC unique. Utilisation informations, l'appareil qui effectue le processus de détection peut alors choisir pour initier une connexion à l'appareil détecté.
Comme les appareils visibles peuvent révéler des informations sur la position de l'utilisateur, le processus de détection d'appareils nécessite un accès à la position. Si votre application est utilisée sur un appareil équipé d'Android 8.0 (niveau d'API 26) ou version ultérieure, envisagez d'utiliser la Gestionnaire d'appareils associés API. Cette API effectue la détection d'appareils pour le compte de votre application, de sorte que celle-ci n'a pas besoin de demander l'autorisation d'accéder à la position.
Lorsqu'une connexion est établie pour la première fois avec un appareil distant, est automatiquement présentée à l'utilisateur. Lorsqu'un appareil est associé, le des informations de base sur l'appareil, telles que son nom, sa classe et son adresse MAC est enregistrée et peut être lue à l'aide des API Bluetooth. Avec l'adresse MAC connue pour un appareil distant, vous pouvez établir une connexion avec celui-ci à tout moment sans effectuer de détection, en supposant que l'appareil est toujours à portée.
Notez qu'il existe une différence entre le fait d'être associé et d'être connecté:
- Être associé signifie que deux appareils sont informés de l'existence de l'autre. ont une clé de lien partagée pouvant être utilisée pour l'authentification et sont capables de en établissant une connexion chiffrée les uns avec les autres.
- Pour être connectés, les appareils partagent actuellement un canal RFCOMM et sont capables de se transmettre des données entre eux. Le Bluetooth actuel Les API exigent que les appareils soient associés avant qu'une connexion RFCOMM puisse être établi. L'association est effectuée automatiquement lorsque vous lancez un processus avec les API Bluetooth.
Les sections suivantes décrivent comment trouver les appareils qui ont été associés et comment découvrir de nouveaux appareils à l'aide de la détection d'appareils.
Interroger les appareils associés
Avant de procéder à la détection d'appareils, il est utile d'interroger l'ensemble des appareils
appareils pour voir si l'appareil souhaité est déjà connu. Pour ce faire, appelez
getBondedDevices()
Cela renvoie un ensemble de
Objets BluetoothDevice
représentant des appareils associés. Par exemple, vous pouvez envoyer une requête
à tous les appareils associés et
obtenir le nom et l'adresse MAC de chaque appareil, comme dans l'extrait de code suivant :
montre comment:
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 } }
Pour établir une connexion avec un appareil Bluetooth, il vous suffit de passer par
l'objet BluetoothDevice
associé est l'adresse MAC, que vous récupérez en
Appel en cours
getAddress()
Toi
vous pouvez en savoir plus sur la création d'une connexion dans Connecter des
appareils mobiles.
Découvrir des appareils
Pour commencer à découvrir des appareils, appelez
startDiscovery()
Le processus est asynchrone et renvoie une valeur booléenne indiquant si
la découverte a démarré. Le processus de découverte implique généralement
analyse de la demande d'environ 12 secondes, suivie d'une analyse de la page pour chaque appareil détecté
pour récupérer son nom Bluetooth.
Pour recevoir des informations sur chaque appareil détecté, votre application doit enregistrer un
BroadcastReceiver
pour le
ACTION_FOUND
l'intention. Le système diffuse cet intent pour chaque appareil. L'intent contient
les champs supplémentaires
EXTRA_DEVICE
et
EXTRA_CLASS
, qui
et elles contiennent à leur tour un BluetoothDevice
et un
BluetoothClass
.
L'extrait de code suivant montre comment vous inscrire pour gérer la diffusion
lorsque des appareils sont détectés:
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); }
Pour établir une connexion avec un appareil Bluetooth, vous devez appeler getAddress()
sur le
BluetoothDevice
pour récupérer l'adresse MAC associée.
Activer la visibilité
Pour rendre l'appareil local visible par d'autres appareils, appelez
startActivityForResult(Intent, int)
avec le
ACTION_REQUEST_DISCOVERABLE
l'intention. Une requête est alors émise pour activer le mode visible du système sans
avoir à accéder à l'application Paramètres, ce qui arrête votre propre application. Par
par défaut, l'appareil devient visible pendant deux minutes. Vous pouvez définir
d'une durée différente, jusqu'à une heure, en ajoutant le paramètre
EXTRA_DISCOVERABLE_DURATION
supplémentaires.
L'extrait de code suivant définit l'appareil pour qu'il soit visible pendant cinq minutes:
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);
Figure 2:Boîte de dialogue d'activation de la visibilité
Une boîte de dialogue s'affiche, demandant l'autorisation de l'utilisateur pour rendre l'appareil
visible, comme illustré dans la figure 2. Si l'utilisateur répond "Autoriser", puis
l'appareil devient visible pendant la durée spécifiée. Votre activité à ce moment-là
reçoit un appel vers
onActivityResult()
avec un code de résultat égal à la durée d'exécution de l'appareil
visible. Si l'utilisateur a répondu "Refuser" ou si une erreur s'est produite, le résultat
le code est RESULT_CANCELED
.
L'appareil reste silencieux pendant le temps imparti. Pour être
notifié lorsque le mode visible a été modifié, enregistrez un BroadcastReceiver
pour le
ACTION_SCAN_MODE_CHANGED
l'intention. Cet intent contient les champs supplémentaires
EXTRA_SCAN_MODE
et
EXTRA_PREVIOUS_SCAN_MODE
,
qui fournissent respectivement le nouveau et l'ancien mode d'analyse. Les valeurs possibles pour chaque
supplémentaires sont les suivants:
SCAN_MODE_CONNECTABLE_DISCOVERABLE
- L'appareil est en mode visible.
SCAN_MODE_CONNECTABLE
- L'appareil n'est pas en mode visible, mais peut toujours recevoir des connexions.
SCAN_MODE_NONE
- L'appareil n'est pas en mode visible et ne peut pas recevoir de connexions.
Si vous initiez la connexion à un appareil distant, vous n'avez pas besoin de permettent d'améliorer la visibilité des appareils. L'activation de la visibilité n'est nécessaire que vous voulez que votre application héberge un socket de serveur qui accepte les connexions car les appareils distants doivent pouvoir détecter d'autres appareils avant initier des connexions à ces autres appareils.