Как предотвратить кэширование имен и обнаружить изменения имени Bluetooth при обнаружении

Я пишу приложение для Android, которое получает информацию с устройства Bluetooth. Наш клиент предположил, что Bluetooth-устройство (которое они производят) будет менять свое имя в зависимости от определенных условий - для простейшего примера его имя будет иногда "xxx-ON", а иногда "xxx-OFF". Мое приложение просто должно искать этот передатчик BT (я использую BluetoothAdapter.startDiscovery() ) и делать разные вещи в зависимости от имени, которое оно находит. Я НЕ подключаюсь к устройству Bluetooth (хотя я полагаю, что это возможно, приложение должно в конечном итоге работать с несколькими устройствами Android и несколькими передатчиками BT, поэтому я не уверен, что это будет хорошей идеей).

Мой код отлично работает для обнаружения устройств BT и поиска их имен. Кроме того, если устройство срабатывает, я могу обнаружить, что в следующий раз, когда я ищу, его там нет. Но похоже, что если он там есть и меняет имя, я подбираю старое имя - предположительно оно где-то закешировано. Даже если устройство bluetooth отключается, и мы это замечаем, в следующий раз, когда я его обнаруживаю, я все равно вижу старое имя.

Я нашел эту проблему в Google Code: здесь, но это было неясно. мне даже как использовать данный обходной путь ("попытаться подключиться"). Кто-нибудь делал это и ему повезло? Можете ли вы поделиться кодом?

Есть ли простой способ просто удалить кешированные имена и выполнить повторный поиск, чтобы всегда находить самые новые имена? Даже не простой способ был бы хорош (пишу для рутованного устройства).

Спасибо


person Kibi    schedule 16.04.2012    source источник


Ответы (1)


Я бы предложил «fetchUuidsWithSdp()». Важно то, что, в отличие от аналогичного метода getUuids(), fetchUuidsWithSdp заставляет устройство обновлять кэшированную информацию об удаленном устройстве. И я считаю, что это включает в себя удаленное имя, а также SPD.

Обратите внимание, что оба упомянутых мной метода скрыты до версии 4.0.3, поэтому ваш код будет выглядеть так:

public static void startServiceDiscovery( BluetoothDevice device ) {
    // Need to use reflection prior to API 15
    Class cl = null;
    try {
        cl = Class.forName("android.bluetooth.BluetoothDevice");
    } catch( ClassNotFoundException exc ) {
        Log.e(CTAG, "android.bluetooth.BluetoothDevice not found." );
    }
    if (null != cl) {
        Class[] param = {};
        Method method = null;
        try {
            method = cl.getMethod("fetchUuidsWithSdp", param);
        } catch( NoSuchMethodException exc ) {
            Log.e(CTAG, "fetchUuidsWithSdp not found." );
        }
        if (null != method) {
            Object[] args = {};
            try {
                method.invoke(device, args);
            } catch (Exception exc) {
                Log.e(CTAG, "Failed to invoke fetchUuidsWithSdp method." );
            }               
        }
    }
}

Затем вам нужно будет прослушать намерение BluetoothDevice.ACTION_NAME_CHANGED и извлечь из него BluetoothDevice.EXTRA_NAME.

Дайте мне знать, если это поможет.

person Tom    schedule 16.04.2012
comment
Спасибо, Том - это определенно путь, по которому я собираюсь пойти - он действительно улавливает изменение имени передатчика BT .... кажется, мне действительно нужно также уловить, если устройство BT отключилось. Есть ли какое-либо другое действие, которое я мог бы прослушать, чтобы увидеть, исчезло ли оно (вообще не вещание). Я был бы рад задать это как еще один вопрос, если вы поможете мне с формулировкой. - person Kibi; 19.04.2012
comment
Есть ли какое-либо другое действие, которое я мог бы прослушать, чтобы увидеть, исчезло ли оно (вообще не вещание). Если у вас есть соединение с ним, вы можете использовать ACTION_ACL_DISCONNECTED, чтобы определить, когда оно исчезнет, ​​но в противном случае вам придется сделать что-то, что попытается создать новое соединение (например, fetchUuidsWithSdp), или сделать другое обнаружение. Обратите внимание, что обнаружение — очень дорогая операция, поэтому вы должны делать ее как можно реже. - person Tom; 19.04.2012
comment
Пожалуйста, мой вопрос: где я должен использовать метод startServiceDiscovery()? - person naima; 01.05.2020