Bluetooth для Android: список сопряженных устройств - PullRequest
6 голосов
/ 07 ноября 2011

У меня есть устройство Bluetooth с профилем SPP и версией Bluetooth 2.1.
У меня есть приложение, которое подключается к этому устройству и связывается с ним.Устройство использует метод сопряжения Just Works.

Я столкнулся с проблемой на некоторых телефонах, таких как планшет Samsung Galaxy, Galaxy S.

Проблема в том, что после выхода пользователя из приложения я закрываю сокеты и отключаюсь от устройства.После успешного отключения наблюдается, что запись устройства удаляется из списка сопряженных устройств.

Ответы [ 3 ]

13 голосов
/ 19 ноября 2011

Я не работал с планшетами, но я написал приложение, которое использовало SPP для телефонов Android. Я обнаружил, что для обеспечения стабильности Bluetooth я должен вручную связаться с устройством, с которым я хочу общаться. Мы использовали приведенный ниже код, чтобы инициировать связывание из приложения, и оно должно сохранить связывание так же, как если бы вы вручную подключались через меню настроек.

Вот общий поток: 1) Зарегистрируйте BroadcastReceiver для прослушивания BluetoothDevice.ACTION_BOND_STATE_CHANGED
2) После обнаружения устройства у вас должен быть объект BluetoothDevice.
3) Используйте отражение для вызова метода createBond для BluetoothDeviceObject
3a) Дождитесь события изменения состояния связи, прежде чем открывать сокеты

BluetoothDevice device = {obtained from device discovery};
Method m = device.getClass().getMethod("createBond", (Class[])null);
m.invoke(device, (Object[])null);

int bondState = device.getBondState();
if (bondState == BluetoothDevice.BOND_NONE || bondState == BluetoothDevice.BOND_BONDING)
{
    waitingForBonding = true; // Class variable used later in the broadcast receiver

    // Also...I have the whole bluetooth session running on a thread.  This was a key point for me.  If the bond state is not BOND_BONDED, I wait here.  Then see the snippets below
    synchronized(this)
    {
        wait();
    }
}

4) Подождите, пока состояние связи изменится с BOND_BONDING на BOND_BONDED

Внутри BroadcastReciever:

public void onReceive(Context context, Intent intent)
{
    if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction()))
    {
        int prevBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1);
        int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1);

        if (waitingForBonding)
        {
            if (prevBondState == BluetoothDevice.BOND_BONDING)
            {
                // check for both BONDED and NONE here because in some error cases the bonding fails and we need to fail gracefully.
                if (bondState == BluetoothDevice.BOND_BONDED || bondState == BluetoothDevice.BOND_NONE)
                {
                    // safely notify your thread to continue
                }
            }
        }
    }
}

5) Откройте розетки и общайтесь

Вы также можете использовать метод removeBond с помощью отражения, чтобы удалить ваше устройство из списка сопряжения.

Надеюсь, это поможет!

0 голосов
/ 08 декабря 2011

У меня тоже была такая же проблема с Sony Xperia X10.Мне удалось заставить его «запомнить» сопряжение, изменив настройки уровня безопасности на стороне устройства Bluetooth (так же, как я разрабатываю устройство).будет зависеть от производителя, не имеет особого смысла, что разные телефоны будут по-разному реагировать на соединение с одним и тем же устройством.Как правило, стек Bluetooth кажется сбой, когда пользователь отключает устройство, когда приложение подключено в фоновом режиме.Я до сих пор не понял, как правильно управлять событием ACTION_BOND_STATE_CHANGED.

0 голосов
/ 12 ноября 2011

Если спаривание происходит вследствие подключения вашего приложения, я предполагаю, что некоторые устройства будут рассматривать его как временное спаривание и не сохранят устройство в списке пар после отключения соединения.Чтобы сохранить устройство в сопряженном списке, необходимо вручную выполнить сопряжение через меню настроек Bluetooth.После сопряжения ваша программа может подключиться / отключиться, и устройство сохранит себя в списке сопряженных.

...