Eşleştirilmiş cihazların bir listesini nasıl alacağımı anlıyorum, ancak bağlı olup olmadıklarını nasıl anlayabilirim?
Telefonumun Bluetooth cihaz listesinde listelendiğini gördüğüm ve bağlantı durumlarını belirttiği için mümkün olmalı.
Eşleştirilmiş cihazların bir listesini nasıl alacağımı anlıyorum, ancak bağlı olup olmadıklarını nasıl anlayabilirim?
Telefonumun Bluetooth cihaz listesinde listelendiğini gördüğüm ve bağlantı durumlarını belirttiği için mümkün olmalı.
Yanıtlar:
AndroidManifest'inize bluetooth izni ekleyin,
<uses-permission android:name="android.permission.BLUETOOTH" />
Sonra dinlemek için niyet filtreleri kullanın ACTION_ACL_CONNECTED
, ACTION_ACL_DISCONNECT_REQUESTED
ve ACTION_ACL_DISCONNECTED
yayınları:
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
}
}
};
Birkaç not:
Kullanım durumumda, yalnızca bir VoIP uygulaması için bir Bluetooth kulaklığın bağlı olup olmadığını görmek istedim. Aşağıdaki çözüm benim için çalıştı:
public static boolean isBluetoothHeadsetConnected() {
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
&& mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED;
}
Elbette Bluetooth iznine ihtiyacınız olacak:
<uses-permission android:name="android.permission.BLUETOOTH" />
Cevabı için Skylarsutton'a çok teşekkürler. Bunu kendisine yanıt olarak gönderiyorum, ancak kod gönderiyorum çünkü yorum olarak yanıtlayamıyorum. Cevabını çoktan artırdım, bu yüzden herhangi bir puan aramıyorum. Sadece ileri ödüyorum.
Bazı nedenlerden dolayı BluetoothAdapter.ACTION_ACL_CONNECTED, Android Studio tarafından çözülemedi. Belki de Android 4.2.2'de kullanımdan kaldırıldı? İşte kodunun bir değişikliği. Kayıt kodu aynıdır; alıcı kodu biraz farklıdır. Bunu, uygulamanın diğer bölümlerinin referans aldığı Bluetooth bağlantılı bir bayrağı güncelleyen bir hizmette kullanıyorum.
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...
}
};
BluetoothDevice sistem API'sinde https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java'da bir isConnected işlevi vardır.
Sınırlı (eşleştirilmiş) bir cihazın şu anda bağlı olup olmadığını bilmek istiyorsanız, aşağıdaki işlev benim için iyi çalışıyor:
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")
ve olduğunu unutmayın 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) } }
Bu kod kulaklık profilleri içindir, muhtemelen diğer profiller için de çalışacaktır. Öncelikle profil dinleyici sağlamanız gerekir (Kotlin kodu):
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
}
}
}
Ardından bluetooth'u kontrol ederken:
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET)
if (!mBluetoothAdapter.isEnabled) {
return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
}
OnSeviceConnected'ın çağrılması biraz zaman alır. Bundan sonra bağlı kulaklık cihazlarının listesini şuradan alabilirsiniz:
mBluetoothHeadset!!.connectedDevices
BluetoothAdapter.getDefaultAdapter().isEnabled
-> bluetooth açıkken true döndürür
val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as
AudioManager
audioManager.isBluetoothScoOn
-> cihaz bağlandığında doğru döndürür
Bağlantı olaylarını dinlemek değil, bir aygıtın bağlantı durumunu almanın bir yolunu gerçekten arıyordum. İşte benim için çalıştı:
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
}