Почему BluetoothDevice иногда является строкой?

Какой тип устройства Bluetooth??? В этом коде устройство работает как строка (содержащая UUID физического устройства), когда я использую его в Log() для LogCat. Но я не могу присвоить его строковой переменной (Eclipse жалуется, что она типа BluetoothDevice).

String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Log.v(TAG, "Device="+device); //DISPLAYS "Device=58:17:1C:EB:E3:A8" IN LOGCAT
String d = device; // TYPE MISMATCH!
  • Почему объект BluetoothDevice отображается по своему UUID в LogCat, как если бы это была строка?

РЕДАКТИРОВАТЬ: сбой getName() был вызван тем, что BluetoothDevice в первый раз возвращает null, потому что я получаю ACTION_DISCOVERY_STARTED от BluetoothAdapter. Так что это решено. Остается загадкой, почему BluetoothDevice иногда является строкой.


person Tombola    schedule 02.03.2012    source источник


Ответы (2)


Причина, по которой это отображается в журнале, заключается в том, что он реализует toString() (дополнительная информация здесь), что позволяет автоматически преобразовывать его в строка для регистрации.

Если вы хотите, чтобы аппаратный адрес использовался в вашей логике в виде строки, вам следует использовать device.getAddress, формат которого вряд ли изменится.

person Joachim Isaksson    schedule 02.03.2012
comment
Хорошо, но что определяет, что именно поле адреса из всех полей в BluetoothDevice используется функцией toString()? Могу ли я определить, какое поле объекта должно использоваться по умолчанию с помощью object.toString? - person Tombola; 02.03.2012
comment
@Tombola Когда вы реализуете свои собственные классы, вы можете решить для себя, внедрив toString (), с такими системными классами может быть сложно расширить / переопределить только для того, чтобы изменить это. Обычно я создаю статический класс Debug с элементами, которые берут, например, устройство BlueTooth и возвращают строку, которую я хочу, а затем вызываю Log.v(Debug.btDeviceAsString(device)) для ее регистрации. Некрасиво, но работоспособно и менее хлопотно, чем расширять каждый класс, для которого я хочу собственный формат. Я почти уверен, что есть лучшие способы, предложения приветствуются :) - person Joachim Isaksson; 02.03.2012

device, который вы получаете, является не строкой, а экземпляром BluetoothDevice.
Если вам нужно имя этого устройства Bluetooth, вы можете использовать:

device.getName(); //returns the string representation of this bluetooth

Интересно, что когда вы используете ArrayList<BluetoothDevice> в качестве одного из входов ListView, выходом в списке является MAC-адрес, а не UUID, как вы предложили.

Если вам нужен UUID, вы можете использовать:

uuid = device.getUuids()[0].getUuid();
person ksu    schedule 10.05.2013