13

こんにちは、みなさん!

少し前にAndroidでBluetoothを使ってプログラミングを始めました。しかし今、私はいくつかの問題に遭遇しました。ペアリングリクエストが通知バーに表示されることがあり、これがスキップされてダイアログが直接表示されることがあるのはなぜだろうか。

例:組み込みデバイスからペアリングリクエストを開始すると、次のような通知が表示されます。

英語:Bluetoothのペアリングリクエスト

また、通知を気にする必要がない場合もあります。ダイアログは意図したとおりに表示されます。

ペアリングダイアログが表示され、ステータスバーに通知がありませんでした

その通知をキャッチしてダイアログを表示する方法はありますか、それとも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設定が表示されている場合
4

3 に答える 3

9

Androidソースコードで見たコメントによると

BluetoothPairingRequest は、Bluetooth ペアリング要求のレシーバーです。Bluetooth 設定が現在表示されているかどうかを確認し、PIN、パスキー、または確認入力ダイアログを表示します。それ以外の場合は、ステータス バーに通知が表示されます。これをクリックすると、ペアリング エントリ ダイアログが表示されます。

そうです、BT の可視性に応じて、ダイアログ/通知が表示されます。

ninja edit: 

これは、使用するハードウェアによって異なる場合があります。

  • デバイスが最近検出可能モードだった場合
  • デバイスが最近検出していた場合
  • デバイスが最近デバイス ピッカーで選択された場合
于 2011-07-27T08:11:21.117 に答える