簡體   English   中英

通知欄上的藍牙配對請求?

[英]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;
}

這是源代碼中的一個片段,正如您所看到的,有多種方法可以顯示對話框:

  1. 如果設備最近處於可發現模式
  2. 如果設備最近正在發現
  3. 如果最近在設備選擇器中選擇了設備
  4. 如果藍牙設置可見

根據我在 android 源代碼中看到的評論

BluetoothPairingRequest 是任何藍牙配對請求的接收器。 它會檢查藍牙設置當前是否可見並顯示 PIN、密碼或確認輸入對話框。 否則,它會在狀態欄中放置一個通知,可以單擊該通知以顯示配對條目對話框。

所以是的,根據 BT 的可見性,將顯示對話框/通知。

ninja edit: 

這可能會因所使用的硬件而異。

  • 如果設備最近處於可發現模式
  • 如果設備最近正在發現
  • 如果最近在設備選擇器中選擇了設備

我知道這個帖子很舊,但我想為有同樣問題的人添加一個簡單的答案。 上面的答案很好地解釋了原因和內容,但沒有顯示簡單的解決方案。

在啟動綁定之前調用此函數可以完成以下工作:

private void feintBluetoothDeviceDiscovery() {
    BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
    btAdapter.startDiscovery();
    btAdapter.cancelDiscovery();
}

它只是觸發了一個發現。 看起來有點愚蠢,但似乎工作得很好。

另請參見此處: Android 藍牙配對:如何確保在前面的對話框中獲得藍牙配對請求而不是通知?

是的,線程很舊,但它比@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM