Eu entendo como obter uma lista de dispositivos emparelhados, mas como posso saber se eles estão conectados?
Deve ser possível, pois eu os vejo listados na lista de dispositivos Bluetooth do meu telefone e ele indica o status da conexão.
Eu entendo como obter uma lista de dispositivos emparelhados, mas como posso saber se eles estão conectados?
Deve ser possível, pois eu os vejo listados na lista de dispositivos Bluetooth do meu telefone e ele indica o status da conexão.
Respostas:
Adicione permissão de bluetooth ao seu AndroidManifest,
<uses-permission android:name="android.permission.BLUETOOTH" />
Em seguida, use filtros de intenção de ouvir o ACTION_ACL_CONNECTED
, ACTION_ACL_DISCONNECT_REQUESTED
e ACTION_ACL_DISCONNECTED
transmissões:
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
}
}
};
Algumas notas:
No meu caso de uso, eu só queria ver se um fone de ouvido Bluetooth está conectado a um aplicativo VoIP. A seguinte solução funcionou para mim:
public static boolean isBluetoothHeadsetConnected() {
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
&& mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED;
}
Claro, você precisará da permissão do Bluetooth:
<uses-permission android:name="android.permission.BLUETOOTH" />
Muito obrigado a Skylarsutton por sua resposta. Estou postando isso como uma resposta ao dele, mas como estou postando um código, não posso responder como um comentário. Já votei positivamente em sua resposta, então não estou procurando nenhum ponto. Apenas pagando adiante.
Por algum motivo, BluetoothAdapter.ACTION_ACL_CONNECTED não pôde ser resolvido pelo Android Studio. Talvez tenha sido preterido no Android 4.2.2? Aqui está uma modificação de seu código. O código de registro é o mesmo; o código do receptor é ligeiramente diferente. Eu uso isso em um serviço que atualiza um sinalizador conectado por Bluetooth que outras partes do aplicativo fazem referência.
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...
}
};
Há uma função isConnected na API do sistema BluetoothDevice em https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java
Se você quiser saber se um dispositivo vinculado (emparelhado) está conectado ou não, a seguinte função funciona bem para mim:
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) } }
Este código é para os perfis de fone de ouvido, provavelmente funcionará para outros perfis também. Primeiro você precisa fornecer um listener de perfil (código 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
}
}
}
Em seguida, ao verificar o bluetooth:
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET)
if (!mBluetoothAdapter.isEnabled) {
return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
}
Demora um pouco até que onSeviceConnected seja chamado. Depois disso, você pode obter a lista dos dispositivos de fone de ouvido conectados em:
mBluetoothHeadset!!.connectedDevices
BluetoothAdapter.getDefaultAdapter().isEnabled
-> retorna verdadeiro quando o bluetooth está aberto
val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as
AudioManager
audioManager.isBluetoothScoOn
-> retorna verdadeiro quando o dispositivo está conectado
Eu estava realmente procurando uma maneira de obter o status da conexão de um dispositivo, e não ouvir eventos de conexão. Aqui está o que funcionou para mim:
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
}