Запрос сопряжения Bluetooth на панели уведомлений? - PullRequest
12 голосов
/ 25 июля 2011

Привет всем!

Начал программировать через Bluetooth на Android некоторое время назад.Но сейчас я столкнулся с некоторыми проблемами.Мне интересно, почему запрос на сопряжение иногда отображается в панели уведомлений, а иногда это пропускается, и диалоговое окно отображается напрямую.

Например: я инициирую запрос на сопряжение со встроенного устройства, а затем появляется следующее уведомление:

In english: Pairing request for Bluetooth

И иногда я нене нужно беспокоиться об уведомлении, мой диалог просто появляется так, как я и предполагал.

Pairing dialog shows up and there was no notification on the status bar

Есть ли способ пойматьэто уведомление и отображение диалогового окна или это ошибка в моем коде, когда я инициирую соединение Bluetooth?

РЕДАКТИРОВАТЬ:

ОБНОВЛЕНИЕ 1:

Проверено ответом, который дал мне Рено, и это на самом деле зависит от множества вещей.Существуют и другие способы непосредственного отображения диалога.Следующий метод вызывается при получении запроса на сопряжение.Проверка выполняется для того, чтобы увидеть, должно ли диалоговое окно отображаться на переднем плане (true) или как уведомление (false):

public boolean shouldShowDialogInForeground(String deviceAddress) {
    // If Bluetooth Settings is visible
    if (mForegroundActivity != null) return true;

    long currentTimeMillis = System.currentTimeMillis();
    SharedPreferences sharedPreferences = getSharedPreferences();

    // If the device was in discoverABLE mode recently
    long lastDiscoverableEndTime = sharedPreferences.getLong(
            BluetoothDiscoverableEnabler.SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP, 0);
    if ((lastDiscoverableEndTime + GRACE_PERIOD_TO_SHOW_DIALOGS_IN_FOREGROUND)
            > currentTimeMillis) {
        return true;
    }

    // If the device was discoverING recently
    if (mAdapter != null && mAdapter.isDiscovering()) {
        return true;
    } else if ((sharedPreferences.getLong(SHARED_PREFERENCES_KEY_DISCOVERING_TIMESTAMP, 0) +
            GRACE_PERIOD_TO_SHOW_DIALOGS_IN_FOREGROUND) > currentTimeMillis) {
        return true;
    }

    // If the device was picked in the device picker recently
    if (deviceAddress != null) {
        String lastSelectedDevice = sharedPreferences.getString(
                SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE, null);

        if (deviceAddress.equals(lastSelectedDevice)) {
            long lastDeviceSelectedTime = sharedPreferences.getLong(
                    SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE_TIME, 0);
            if ((lastDeviceSelectedTime + GRACE_PERIOD_TO_SHOW_DIALOGS_IN_FOREGROUND)
                    > currentTimeMillis) {
                return true;
            }
        }
    }
    return false;
}

Это фрагмент из исходного кода и какВы можете видеть, что есть способы заставить диалоговое окно показывать:

  1. Если устройство недавно находилось в режиме обнаружения
  2. Если устройство обнаруживало недавно
  3. Если устройство недавно было выбрано в окне выбора устройства
  4. Если настройки Bluetooth отображаются

1 Ответ

9 голосов
/ 27 июля 2011

Согласно комментарию, который я видел в исходном коде Android

BluetoothPairingRequest - приемник для любого сопряжения Bluetooth запрос. Он проверяет, видны ли настройки Bluetooth в данный момент и вызывает PIN-код, пароль или диалоговое окно подтверждения. В противном случае он помещает Уведомление в строке состояния, которое может быть щелкните, чтобы открыть диалоговое окно «Сопряжение».

Так что да, в зависимости от видимости BT, будет отображаться диалог / уведомление.

ninja edit: 

Это может варьироваться в зависимости от используемого оборудования.

  • Если устройство недавно находилось в режиме DiscoverABLE
  • Если устройство обнаруживалось недавно
  • Если устройство недавно было выбрано в окне выбора устройства
...