[英]Bluetooth pairing request on notification bar?
嘿大家!
不久前開始在 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;
}
這是源代碼中的一個片段,正如您所看到的,有多種方法可以顯示對話框:
BluetoothPairingRequest 是任何藍牙配對請求的接收器。 它會檢查藍牙設置當前是否可見並顯示 PIN、密碼或確認輸入對話框。 否則,它會在狀態欄中放置一個通知,可以單擊該通知以顯示配對條目對話框。
所以是的,根據 BT 的可見性,將顯示對話框/通知。
ninja edit:
這可能會因所使用的硬件而異。
我知道這個帖子很舊,但我想為有同樣問題的人添加一個簡單的答案。 上面的答案很好地解釋了原因和內容,但沒有顯示簡單的解決方案。
在啟動綁定之前調用此函數可以完成以下工作:
private void feintBluetoothDeviceDiscovery() {
BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
btAdapter.startDiscovery();
btAdapter.cancelDiscovery();
}
它只是觸發了一個發現。 看起來有點愚蠢,但似乎工作得很好。
是的,線程很舊,但它比@maze 的解決方案略多。
編輯:我接受了這個補充。 我發現在我的 BTLE-only 應用程序中,我沒有在為其分配的時間段內調用 startDiscovery,這就是 @maze 解決方案不起作用的原因。 我認為添加工作的唯一原因是我之前嘗試過我的經典和 BTLE 應用程序並且時間還沒有過去。
如果我想要彈出一個對話框而不是配對事件的通知,我必須在配對請求的一分鍾內調用 startDiscovery()。 但這也需要多走一步。 我必須在 BroadcastReceiver 中有一個事件處理程序。
我偶然發現了這一點,因為我編寫了一個使用連續后台搜索過程的 PHG,該過程在 startDiscovery() 之間循環 X 秒,然后 Btle 掃描 Y 秒。 它處理經典和 Btle 設備。 我知道我需要調用 startDiscovery 但由於經典發現是在 BroadcastReceiver 中處理的,因此我有處理程序。
現在我正在寫一個類似的 PHG,它只支持BTLE。 我在后台掃描程序中保留了 startDiscovery() 循環,因為我知道我至少需要它才能獲得對話框。 但是我刪除了 BroadcastReceiver 中的處理程序。 我唯一的處理程序是配對事件。 結果 - 沒有對話框。 所以我添加了以下內容,即使他們現在除了打印日志什么都不做:
//================ CONNECT ==============================
if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(intent.getAction()))
{
Log.i(TAG, "BT State Receiver signaled with connected for device " + device.getName() + " with bond state " + device.getBondState());
}
//================ DISCONNECT ==============================
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(intent.getAction()))
{
Log.i(TAG, "BT State Receiver signaled with disconnect for device " + device.getName() + " with bond state " + device.getBondState());
}
//================ START/STOP DISCOVERY ==============================
else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(intent.getAction()))
{
Log.i(TAG, "BT State Receiver signaled discovery started");
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(intent.getAction()))
{
Log.v(TAG, "BT State receiver, discovery stopped");
}
//================ FOUND DEVICE ==============================
else if (BluetoothDevice.ACTION_FOUND.equals(intent.getAction()))
{
Log.v(TAG, "Device discovered: name " + device.getName() +
" Bond state " + device.getBondState());
}
不幸的是,我不知道我是否需要上述所有內容或僅需要“ACTION_FOUND”處理程序。 我想我可以一個一個地刪除其他人,看看我是否仍然能看到對話,但我被一連串的懶惰擊中了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.