список подключенных устройств Bluetooth?

Как я могу перечислить все подключенные устройства Bluetooth на Android?

Спасибо!


person Shatazone    schedule 14.10.2010    source источник
comment
У вас есть решение для этого. Я ищу то же самое, пожалуйста, дайте ответ.   -  person Gangadhar Nimballi    schedule 16.11.2015


Ответы (7)


Начиная с 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;
}
person Yossi    schedule 18.09.2012
comment
Привет, Йосси, у тебя есть какой-нибудь код для этого? Было бы здорово :) - person Nicholas TJ; 05.03.2013
comment
Это всегда возвращает меня true, если у меня включен Bluetooth, даже если я ни к чему не подключен. - person JesusS; 17.07.2013
comment
Симулятор или реальное устройство? Какое устройство и версия Android? - person Yossi; 17.07.2013
comment
Эмулятор Android для Android-устройства, у вас есть код для этого? - person Pratik Patel; 06.09.2016

  • Сначала вам нужно получить BluetoothAdapter:

окончательный BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();

  • Во-вторых, вам нужно убедиться, что Bluetooth доступен и включен:

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

person phnmnn    schedule 12.02.2019
comment
У меня есть один вопрос. По какой-то причине я получаю ответ только для устройств HEADSET/A2DP/HEALTH. Ни один другой профиль не вызывается. - person somerandomusername; 02.07.2019

Так вы получите список сопряженных устройств.

 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());

}
person Juan Rosas    schedule 19.02.2020

Система Android не позволяет запрашивать все «в настоящее время» подключенные устройства. Однако вы можете запросить сопряженные устройства. Вам нужно будет использовать широковещательный приемник для прослушивания событий ACTION_ACL_{CONNECTED|DISCONNECTED} вместе с событием STATE_BONDED, чтобы обновлять состояния вашего приложения, чтобы отслеживать, что в данный момент подключено.

person KITT    schedule 10.03.2012

Я нашел решение, и оно работает на 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)

Джава

исходный код

person Kirill Martyuk    schedule 08.06.2020
comment
Привет Кирилл, спасибо за ответ на этот вопрос. Я надеюсь, что вы также могли бы предложить, есть ли способ получить список ранее подключенных устройств Bluetooth, как это показано в настройках Bluetooth системы. Я поднял вопрос для того же здесь: устройства"> stackoverflow.com/questions/67041292/ - person Sudhir; 11.04.2021

Проанализируйте этот класс онлайн.

Здесь вы узнаете, как обнаружить все подключенные (сопряженные) устройства Bluetooth.

person Zelimir    schedule 14.10.2010
comment
привет Дезидерио, как я уже сказал, я хочу перечислить подключенные (активные) устройства, а не сопряженные / доверенные. - person Shatazone; 21.10.2010
comment
Как насчет мониторинга широковещательных передач ACTION_ACL_CONNECTED? - person Zelimir; 21.10.2010
comment
Как я могу скачать этот класс? Я думаю, что это поможет мне в моей проблеме. - person Sonhja; 05.10.2011
comment
Класс DeviceListActivity.java является частью вашей установки Android. Просто исследуйте папку Android. - person Zelimir; 05.10.2011

Ну вот шаги:

  1. Во-первых, вы начинаете намерение обнаруживать устройства

    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

  2. Зарегистрируйте для него широковещательный ресивер:

    registerReceiver(mReceiver, filter);

  3. Об определении 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();
        }
    }
    

и список будет автоматически заполнен при обнаружении нового устройства.

person Emel Elias    schedule 17.02.2012
comment
Отсутствует }; в конце кода. Я не могу отредактировать сам, так как это должно быть изменение 6 символов, а не хватает только 2. - person Matthew Cawley; 18.12.2015
comment
Это для использования с обнаружением, это не для списка уже подключенных устройств. см.: developer.android.com/reference/android/bluetooth/ - person CrashCodes; 12.09.2018