嘿大家!
不久前开始在 Android 上使用蓝牙进行编程。但现在我遇到了一些问题。我想知道为什么配对请求有时会出现在通知栏中,有时会被跳过并直接显示对话框。
例如:我从嵌入式设备发起我的配对请求,然后有一个通知,例如:
有时我不必理会通知,我的对话框会按照我的预期显示。
当我启动蓝牙配对时,有没有办法捕获该通知并显示对话框,或者这是我的代码中的错误?
编辑:
更新 1:
查看 Reno 给我的答案,它实际上取决于很多事情。还有其他直接显示对话框的方法。当配对请求到达时,会调用以下方法。进行检查是为了查看对话框是否应该显示在前台 (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;
}
这是源代码的一个片段,您可以看到有多种方法可以显示对话框:
- 如果设备最近处于可发现模式
- 如果设备最近发现
- 如果最近在设备选择器中选择了设备
- 如果蓝牙设置可见