Capisco come ottenere un elenco di dispositivi accoppiati, ma come posso sapere se sono collegati?
Deve essere possibile poiché li vedo elencati nell'elenco dei dispositivi Bluetooth del mio telefono e indica il loro stato di connessione.
Capisco come ottenere un elenco di dispositivi accoppiati, ma come posso sapere se sono collegati?
Deve essere possibile poiché li vedo elencati nell'elenco dei dispositivi Bluetooth del mio telefono e indica il loro stato di connessione.
Risposte:
Aggiungi l'autorizzazione Bluetooth al tuo AndroidManifest,
<uses-permission android:name="android.permission.BLUETOOTH" />
Quindi utilizzare filtri intento ad ascoltare la ACTION_ACL_CONNECTED
, ACTION_ACL_DISCONNECT_REQUESTED
e ACTION_ACL_DISCONNECTED
le trasmissioni:
public void onCreate() {
...
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
this.registerReceiver(mReceiver, filter);
}
//The BroadcastReceiver that listens for bluetooth broadcasts
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
... //Device found
}
else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
... //Device is now connected
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
... //Done searching
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
... //Device is about to disconnect
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
... //Device has disconnected
}
}
};
Alcune note:
Nel mio caso d'uso volevo solo vedere se un auricolare Bluetooth è connesso per un'app VoIP. La seguente soluzione ha funzionato per me:
public static boolean isBluetoothHeadsetConnected() {
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
&& mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED;
}
Ovviamente avrai bisogno dell'autorizzazione Bluetooth:
<uses-permission android:name="android.permission.BLUETOOTH" />
Grazie mille a Skylarsutton per la sua risposta. Sto postando questo come risposta al suo, ma poiché sto postando codice non posso rispondere come commento. Ho già votato positivamente la sua risposta, quindi non sto cercando punti. Solo pagandolo in avanti.
Per qualche motivo BluetoothAdapter.ACTION_ACL_CONNECTED non può essere risolto da Android Studio. Forse è stato deprecato in Android 4.2.2? Ecco una modifica del suo codice. Il codice di registrazione è lo stesso; il codice del ricevitore è leggermente diverso. Lo uso in un servizio che aggiorna un flag di connessione Bluetooth a cui fanno riferimento altre parti dell'app.
public void onCreate() {
//...
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
this.registerReceiver(BTReceiver, filter);
}
//The BroadcastReceiver that listens for bluetooth broadcasts
private final BroadcastReceiver BTReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
//Do something if connected
Toast.makeText(getApplicationContext(), "BT Connected", Toast.LENGTH_SHORT).show();
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
//Do something if disconnected
Toast.makeText(getApplicationContext(), "BT Disconnected", Toast.LENGTH_SHORT).show();
}
//else if...
}
};
C'è una funzione isConnected nell'API del sistema BluetoothDevice in https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java
Se vuoi sapere se il dispositivo collegato (accoppiato) è attualmente connesso o meno, la seguente funzione funziona bene per me:
public static boolean isConnected(BluetoothDevice device) {
try {
Method m = device.getClass().getMethod("isConnected", (Class[]) null);
boolean connected = (boolean) m.invoke(device, (Object[]) null);
return connected;
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
bluetoothManager.getConnectionState(device, BluetoothProfile.GATT) == BluetoothProfile.STATE_CONNECTED
?
val m: Method = device.javaClass.getMethod("isConnected")
e val connected = m.invoke(device)
.
fun isConnected(device: BluetoothDevice): Boolean { return try { val m: Method = device.javaClass.getMethod( "isConnected" ) m.invoke(device) as Boolean } catch (e: Exception) { throw IllegalStateException(e) } }
Questo codice è per i profili delle cuffie, probabilmente funzionerà anche per altri profili. Per prima cosa devi fornire il listener del profilo (codice Kotlin):
private val mProfileListener = object : BluetoothProfile.ServiceListener {
override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
if (profile == BluetoothProfile.HEADSET)
mBluetoothHeadset = proxy as BluetoothHeadset
}
override fun onServiceDisconnected(profile: Int) {
if (profile == BluetoothProfile.HEADSET) {
mBluetoothHeadset = null
}
}
}
Quindi durante il controllo del Bluetooth:
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET)
if (!mBluetoothAdapter.isEnabled) {
return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
}
Ci vuole un po 'di tempo prima che venga chiamato onSeviceConnected. Successivamente è possibile ottenere l'elenco dei dispositivi auricolari collegati da:
mBluetoothHeadset!!.connectedDevices
BluetoothAdapter.getDefaultAdapter().isEnabled
-> restituisce true quando il bluetooth è aperto
val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as
AudioManager
audioManager.isBluetoothScoOn
-> restituisce true quando il dispositivo è connesso
Stavo davvero cercando un modo per recuperare lo stato di connessione di un dispositivo, non per ascoltare gli eventi di connessione. Ecco cosa ha funzionato per me:
BluetoothManager bm = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
List<BluetoothDevice> devices = bm.getConnectedDevices(BluetoothGatt.GATT);
int status = -1;
for (BluetoothDevice device : devices) {
status = bm.getConnectionState(device, BLuetoothGatt.GATT);
// compare status to:
// BluetoothProfile.STATE_CONNECTED
// BluetoothProfile.STATE_CONNECTING
// BluetoothProfile.STATE_DISCONNECTED
// BluetoothProfile.STATE_DISCONNECTING
}