BluetoothDevice всегда возвращает null в getName()

Я постоянно сталкиваюсь с этой проблемой в Android 4.4, 5 и 6.

Я выполняю сканирование устройств BLE Bluetooth, и после этого я могу получить доступ к их адресу (getAddress()) и другим данным. Но если я вызываю device.getName(), он КАЖДЫЙ РАЗ возвращает null.

Эта документация бесполезна, в ней только говорится, что возвращается ноль, если «возникла проблема»: https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#getName()

Другие сообщения, которые я посетил безуспешно:

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

android BluetoothDevice.getName() возвращает null

ble device bluetoothdevice.getname() возвращает null

PS: я использую неустаревшие методы в Android API уровня 21+, так что это не связано с проблемой.

Любая идея о том, что может пойти не так здесь?


person agustinaliagac    schedule 05.08.2016    source источник
comment
Я уверен, что это, вероятно, стандартный код, но вы должны добавить кое-что из того, что используете, и, возможно, кто-то заметит что-то не так. На некоторых устройствах работает? Я никогда не сталкивался с этой проблемой.   -  person codeMagic    schedule 05.08.2016
comment
@codeMagic, спасибо за ответ. Я добавлю код как можно скорее, но на самом деле это очень стандартная имплементация. И это не работает по крайней мере на 4 устройствах, где я мог это проверить.   -  person agustinaliagac    schedule 05.08.2016


Ответы (2)


Возможно, ваше устройство BLE не передает имя. Полезная нагрузка вещания ограничена 31 байтом, и некоторые производители опускают имя для экономии места.

person CaseyB    schedule 05.08.2016
comment
Устройство BLE действительно передает имя, и для проекта существует эквивалентное собственное приложение iOS, из которого я могу получить имя устройства. - person agustinaliagac; 05.08.2016
comment
Прошло много времени, но я наконец смог проверить этот вопрос. Это правильный ответ. Приложение для iOS вело себя иначе по неизвестным мне причинам. Мое устройство BLE не рекламировало свое имя, потому что оно было слишком длинным. Сокращение имени позволило моему приложению прочитать его без проблем. - person agustinaliagac; 18.11.2016
comment
привет, я столкнулся с этой проблемой сейчас, но мой BLE транслирует имя, которое я получаю на нескольких устройствах Android, но на другом устройстве имя по-прежнему равно null. Есть ли способ выдать предупреждение на основе версии Bluetooth, мой пост stackoverflow.com/q/46968687/4111151 - person prasanthMurugan; 27.10.2017

Я больше не использую getName(), так как он кажется неопределенным, когда возвращает реальное имя (и если да, то сколько лет этому кэшированному имени?) и когда оно равно null. Просто проанализируйте scanRecord в рекламных данных и получите имя оттуда ИЛИ прочитайте характеристику имени в базе данных GATT, если вы подключены.

person Emil    schedule 05.08.2016
comment
Не могли бы вы привести краткий пример первого предложения? Я постараюсь реализовать оба варианта и опубликую свои результаты здесь. Спасибо ! - person agustinaliagac; 05.08.2016
comment
Рекламные данные состоят из списка длины, типа и значения, где длина и тип равны одному байту каждый (длина включает тип и значение). Существуют типы для полного имени (0x09) и для сокращенного имени (0x08). См. android.googlesource. .com/platform/frameworks/base/+/ для полного парсера. - person Emil; 05.08.2016