Как я могу перечислить все подключенные устройства Bluetooth на Android?
Спасибо!
Как я могу перечислить все подключенные устройства Bluetooth на Android?
Спасибо!
Начиная с API 14 (Ice Cream), в Android есть несколько новых методов BluetoothAdapter, в том числе:
public int getProfileConnectionState (int profile)
где профиль является одним из HEALTH, HEADSET, A2DP
Проверьте ответ, если это не STATE_DISCONNECTED
, вы знаете, что у вас активное соединение.
Вот пример кода, который будет работать на любом устройстве API:
BluetoothAdapter mAdapter;
/**
* Check if a headset type device is currently connected.
*
* Always returns false prior to API 14
*
* @return true if connected
*/
public boolean isVoiceConnected() {
boolean retval = false;
try {
Method method = mAdapter.getClass().getMethod("getProfileConnectionState", int.class);
// retval = mAdapter.getProfileConnectionState(android.bluetooth.BluetoothProfile.HEADSET) != android.bluetooth.BluetoothProfile.STATE_DISCONNECTED;
retval = (Integer)method.invoke(mAdapter, 1) != 0;
} catch (Exception exc) {
// nothing to do
}
return retval;
}
BluetoothAdapter
:окончательный BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
if (btAdapter != null && btAdapter.isEnabled()) // null означает отсутствие Bluetooth!
Если Bluetooth не отключен, вы можете либо использовать btAdapter.enable()
, что не рекомендуется в документации, либо попросить пользователя сделать это: Программное включение Bluetooth на Android
окончательные состояния int [] = new int [] {BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_CONNECTING};
В-четвертых, вы создаете BluetoothProfile.ServiceListener
, который содержит два обратных вызова, запускаемых при подключении и отключении службы:
final BluetoothProfile.ServiceListener listener = new BluetoothProfile.ServiceListener() {
@Override
public void onServiceConnected(int profile, BluetoothProfile proxy) {
}
@Override
public void onServiceDisconnected(int profile) {
}
};
Теперь, поскольку вам нужно повторить процесс запроса для всех доступных профилей Bluetooth в Android SDK (A2Dp, GATT, GATT_SERVER, Handset, Health, SAP), вы должны действовать следующим образом:
В onServiceConnected
поместите условие, которое проверяет текущий профиль, чтобы мы добавили найденные устройства в правильную коллекцию, и мы используем: proxy.getDevicesMatchingConnectionStates(states)
для фильтрации неподключенных устройств:
switch (profile) {
case BluetoothProfile.A2DP:
ad2dpDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
break;
case BluetoothProfile.GATT: // NOTE ! Requires SDK 18 !
gattDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
break;
case BluetoothProfile.GATT_SERVER: // NOTE ! Requires SDK 18 !
gattServerDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
break;
case BluetoothProfile.HEADSET:
headsetDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
break;
case BluetoothProfile.HEALTH: // NOTE ! Requires SDK 14 !
healthDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
break;
case BluetoothProfile.SAP: // NOTE ! Requires SDK 23 !
sapDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
break;
}
И, наконец, последнее, что нужно сделать, это запустить процесс запроса:
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.A2DP);
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.GATT); // NOTE ! Requires SDK 18 !
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.GATT_SERVER); // NOTE ! Requires SDK 18 !
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.HEADSET);
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.HEALTH); // NOTE ! Requires SDK 14 !
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.SAP); // NOTE ! Requires SDK 23 !
источник: https://stackoverflow.com/a/34790442/2715054
Так вы получите список сопряженных устройств.
BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> pairedDevicesList = btAdapter.getBondedDevices();
for (BluetoothDevice pairedDevice : pairedDevicesList) {
Log.d("BT", "pairedDevice.getName(): " + pairedDevice.getName());
Log.d("BT", "pairedDevice.getAddress(): " + pairedDevice.getAddress());
saveValuePreference(getApplicationContext(), pairedDevice.getName(), pairedDevice.getAddress());
}
Система Android не позволяет запрашивать все «в настоящее время» подключенные устройства. Однако вы можете запросить сопряженные устройства. Вам нужно будет использовать широковещательный приемник для прослушивания событий ACTION_ACL_{CONNECTED|DISCONNECTED} вместе с событием STATE_BONDED, чтобы обновлять состояния вашего приложения, чтобы отслеживать, что в данный момент подключено.
Я нашел решение, и оно работает на Android 10.
private val serviceListener: ServiceListener = object : ServiceListener {
var name: String? = null
var address: String? = null
var threadName: String? = null
override fun onServiceDisconnected(profile: Int) {}
override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
for (device in proxy.connectedDevices) {
name = device.name
address = device.address
threadName = Thread.currentThread().name
Toast.makeText(
this@MainActivity,
"$name $address$threadName",
Toast.LENGTH_SHORT
).show()
Log.i(
"onServiceConnected",
"|" + device.name + " | " + device.address + " | " + proxy.getConnectionState(
device
) + "(connected = "
+ BluetoothProfile.STATE_CONNECTED + ")"
)
}
BluetoothAdapter.getDefaultAdapter().closeProfileProxy(profile, proxy)
}
}
BluetoothAdapter.getDefaultAdapter()
.getProfileProxy(this, serviceListener, BluetoothProfile.HEADSET)
Проанализируйте этот класс сильный> онлайн.
Здесь вы узнаете, как обнаружить все подключенные (сопряженные) устройства Bluetooth.
Ну вот шаги:
Во-первых, вы начинаете намерение обнаруживать устройства
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
Зарегистрируйте для него широковещательный ресивер:
registerReceiver(mReceiver, filter);
Об определении mReceiver:
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// When discovery finds a device
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Add the name and address to an array adapter to show in a ListView
arrayadapter.add(device.getName())//arrayadapter is of type ArrayAdapter<String>
lv.setAdapter(arrayadapter); //lv is the list view
arrayadapter.notifyDataSetChanged();
}
}
и список будет автоматически заполнен при обнаружении нового устройства.