Tambahkan izin bluetooth ke AndroidManifest Anda,
<uses-permission android:name="android.permission.BLUETOOTH" />
Kemudian gunakan filter niat untuk mendengarkan ACTION_ACL_CONNECTED
, ACTION_ACL_DISCONNECT_REQUESTED
dan ACTION_ACL_DISCONNECTED
siaran:
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)) {
...
}
}
};
Beberapa catatan:
- Tidak ada cara untuk mengambil daftar perangkat yang terhubung saat aplikasi dimulai. Bluetooth API tidak mengizinkan Anda untuk QUERY, melainkan memungkinkan Anda untuk mendengarkan PERUBAHAN.
- Solusi hoak untuk mengatasi masalah di atas adalah mengambil daftar semua perangkat yang diketahui / dipasangkan ... kemudian mencoba menyambungkan ke masing-masing (untuk menentukan apakah Anda terhubung).
- Atau, Anda dapat meminta layanan latar belakang untuk mengawasi Bluetooth API dan menulis status perangkat ke disk untuk digunakan aplikasi Anda di kemudian hari.
Dalam kasus penggunaan saya, saya hanya ingin melihat apakah headset Bluetooth terhubung untuk aplikasi VoIP. Solusi berikut berhasil untuk saya:
public static boolean isBluetoothHeadsetConnected() { BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled() && mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED; }
Tentu saja Anda memerlukan izin Bluetooth:
<uses-permission android:name="android.permission.BLUETOOTH" />
sumber
Terima kasih banyak kepada Skylarsutton atas jawabannya. Saya memposting ini sebagai tanggapannya, tetapi karena saya memposting kode, saya tidak dapat membalas sebagai komentar. Saya sudah memberi suara positif pada jawabannya jadi saya tidak mencari poin apa pun. Hanya membayarnya ke depan.
Untuk beberapa alasan BluetoothAdapter.ACTION_ACL_CONNECTED tidak dapat diselesaikan oleh Android Studio. Mungkin itu sudah usang di Android 4.2.2? Berikut ini modifikasi kodenya. Kode registrasinya sama; kode penerima sedikit berbeda. Saya menggunakan ini dalam layanan yang memperbarui tanda yang terhubung dengan Bluetooth yang menjadi referensi bagian lain dari aplikasi.
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... } };
sumber
Ada fungsi isConnected di API sistem BluetoothDevice di https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java
Jika Anda ingin tahu apakah perangkat terikat (berpasangan) saat ini terhubung atau tidak, fungsi berikut berfungsi dengan baik untuk saya:
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); } }
sumber
bluetoothManager.getConnectionState(device, BluetoothProfile.GATT) == BluetoothProfile.STATE_CONNECTED
?val m: Method = device.javaClass.getMethod("isConnected")
danval 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) } }
Kode ini untuk profil headset, mungkin juga akan berfungsi untuk profil lain. Pertama, Anda perlu memberikan pemroses profil (kode 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 } } }
Kemudian saat memeriksa bluetooth:
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET) if (!mBluetoothAdapter.isEnabled) { return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) }
Perlu sedikit waktu hingga onSeviceConnected dipanggil. Setelah itu Anda bisa mendapatkan daftar perangkat headset yang terhubung dari:
mBluetoothHeadset!!.connectedDevices
sumber
BluetoothAdapter.getDefaultAdapter().isEnabled
-> mengembalikan nilai true saat bluetooth terbukaval audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.isBluetoothScoOn
-> mengembalikan nilai true saat perangkat terhubungsumber
Saya benar-benar mencari cara untuk mengambil status koneksi perangkat, bukan mendengarkan peristiwa koneksi. Inilah yang berhasil untuk saya:
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 }
sumber