簡體   English   中英

如何防止名稱緩存並在發現時檢測藍牙名稱更改

[英]How to prevent name caching and detect bluetooth name changes on discovery

我正在編寫一個Android應用程序,該程序從藍牙設備接收信息。 我們的客戶建議,藍牙設備(由他們生產)將根據某些條件更改其名稱-最簡單的例子是,其名稱有時為“ xxx-ON”,有時為“ xxx-OFF”。 我的應用程序只是應該尋找該BT發送器(我使用BluetoothAdapter.startDiscovery()),並根據找到的名稱執行不同的操作。 我沒有與藍牙設備配對(盡管我認為有可能配對,但該應用程序最終應可與多個Android設備和多個BT發射器配合使用,因此我不確定這是一個好主意)。

我的代碼可以很好地檢測BT設備並找到其名稱。 另外,如果設備關閉,我下次可以搜索到它不在那里。 但是似乎它在那里並且更改了名稱,我選擇了舊名稱-大概是緩存在某個地方。 即使藍牙設備關閉,並且我們注意到,下次我檢測到它時,仍然會看到舊名稱。

我在Google代碼中發現了此問題: 在這里,但我什至不知道如何使用給定的解決方法(“嘗試連接”)。 有沒有人做過並且有運氣? 可以共享代碼嗎?

是否有一種簡單的方法可以刪除緩存的名稱並再次搜索,所以我總能找到最新的名稱? 即使是非簡單的方法也將是很好的(我正在寫一個有根設備)。

謝謝

我建議'fetchUuidsWithSdp()'。 重要的是,與類似的getUuids()方法不同,fetchUuidsWithSdp導致設備更新有關遠程設備的緩存信息。 而且我相信這包括遠程名稱以及SPD。

請注意,我提到的兩種方法在4.0.3之前都是隱藏的,因此您的代碼看起來像這樣:

public static void startServiceDiscovery( BluetoothDevice device ) {
    // Need to use reflection prior to API 15
    Class cl = null;
    try {
        cl = Class.forName("android.bluetooth.BluetoothDevice");
    } catch( ClassNotFoundException exc ) {
        Log.e(CTAG, "android.bluetooth.BluetoothDevice not found." );
    }
    if (null != cl) {
        Class[] param = {};
        Method method = null;
        try {
            method = cl.getMethod("fetchUuidsWithSdp", param);
        } catch( NoSuchMethodException exc ) {
            Log.e(CTAG, "fetchUuidsWithSdp not found." );
        }
        if (null != method) {
            Object[] args = {};
            try {
                method.invoke(device, args);
            } catch (Exception exc) {
                Log.e(CTAG, "Failed to invoke fetchUuidsWithSdp method." );
            }               
        }
    }
}

然后,您需要偵聽BluetoothDevice.ACTION_NAME_CHANGED意圖,並從中提取BluetoothDevice.EXTRA_NAME。

讓我知道是否有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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