1

我一直面臨這個問題的是Android 4.4,5和6BluetoothDevice類總是對的getName()

我執行BLE藍牙設備掃描和後,我可以訪問他們的地址(的getAddress(返回null ))和其他數據。但是如果我調用device.getName(),它將每次都返回null。

本文檔是無益的,它只是說,則返回null 「有問題」:https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#getName()

,我參觀了不成功其他職位:

https://code.google.com/p/android/issues/detail?id=34411

android BluetoothDevice.getName() return null

ble device bluetoothdevice.getname() returns null

PS:我正在使用n Android API級別21+中的已棄用的方法,因此與問題無關。

有什麼想法可能會出錯在這裏?

+0

我確定這可能是標準代碼,但你應該添加一些你正在使用的東西,也許有人會注意到一些錯誤。它在某些設備上工作嗎?我從來沒有遇到過這個問題。 – codeMagic

+0

@codeMagic,謝謝你的回答。我會盡快添加一些代碼,但它確實是一個非常標準的實現。至少在我可以測試的4個設備中,它不起作用。 –

回答

1

這可能是因爲您的BLE設備沒有廣播名稱。廣播有效載荷限制爲31個字節,一些製造商省略了一個名稱以節省空間。

+0

BLE設備的確在廣播一個名稱,並且有一個等效的本機iOS應用程序用於從中獲取設備名稱的項目。 –

+0

已經很長時間了,但我終於可以檢查這個問題了。這是正確的答案。由於我不知道的原因,iOS應用程序有不同的行爲。我的BLE設備沒有廣告它的名字,因爲它太長了。縮短名稱使我的應用程序可以毫無問題地閱讀它。 –

+0

嗨,我現在面臨這個問題,但我的BLE廣播名稱我在幾個Android設備上獲得的名稱,但在其他設備上的名稱仍然是null.Is有任何方式拋出基於藍牙版本的警報我的帖子https:// stackoverflow.com/q/46968687/4111151 – prasanthMurugan

1

我不再使用getName(),因爲當它返回一個真實的名字時(如果有的話,這個緩存的名字是多少年?)以及它什麼時候是空的,它似乎是未定義的。只需解析廣告數據中的scanRecord並從中獲取名稱,或者在連接時讀取GATT DB中的名稱特徵。

+0

您能否提供第一個建議的快速示例?我會嘗試實現這兩個選項並在此處發佈我的結果。謝謝 ! –

+0

廣告數據由「長度,類型,值」列表構成,其中長度和類型各爲一個字節(長度包括類型和值)。有完整名稱(0x09)和縮寫名稱(0x08)的類型。有關完整的解析器,請參閱https://android.googlesource.com/platform/frameworks/base/+/414a486e4c721f0f8f9f86823a05422acb1c509f/core/java/android/bluetooth/BluetoothLeAdvertiseScanData.java#540。 – Emil

相關問題