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);
}
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)) {
...
}
else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
...
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
...
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
...
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
...
}
}
};
Algumas notas:
- Não há como recuperar uma lista de dispositivos conectados na inicialização do aplicativo. A API Bluetooth não permite que você QUERY, em vez disso, permite que você ouça CHANGES.
- Uma alternativa complicada para o problema acima seria recuperar a lista de todos os dispositivos conhecidos / emparelhados ... e tentar se conectar a cada um (para determinar se você está conectado).
- Como alternativa, você pode fazer com que um serviço de segundo plano observe a API do Bluetooth e grave os estados do dispositivo em disco para seu aplicativo usar posteriormente.
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" />
fonte
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... } };
fonte
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); } }
fonte
bluetoothManager.getConnectionState(device, BluetoothProfile.GATT) == BluetoothProfile.STATE_CONNECTED
?val m: Method = device.javaClass.getMethod("isConnected")
eval 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
fonte
BluetoothAdapter.getDefaultAdapter().isEnabled
-> retorna verdadeiro quando o bluetooth está abertoval audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.isBluetoothScoOn
-> retorna verdadeiro quando o dispositivo está conectadofonte
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 }
fonte