こんにちは、みなさん!
少し前にAndroidで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;
}
これはソースコードのスニペットであり、ダイアログを表示する方法がいくつかあることがわかります。
- デバイスが最近検出可能モードになっていた場合
- デバイスが最近検出していた場合
- デバイスが最近デバイスピッカーでピッキングされた場合
- Bluetooth設定が表示されている場合