Android Bluetooth не показывает диалоговое окно сопряжения

Я пытаюсь соединить свой HTC myTouch 3G с устройством Bluetooth, которое будет передавать данные через SPP на телефон. Я просмотрел примеры чата и обнаружил, что в них не хватает того, что мне нужно, из-за высокой скорости передачи данных, которая мне понадобится, а пример чата блокирует поток пользовательского интерфейса. Но это говорит о том, что моя главная проблема заключается в том, что когда я пытаюсь подключить устройство, которое в настоящее время не сопряжено, Bluetooth API сообщает, что автоматически откроется диалоговое окно, если для устройства требуется код сопряжения. Этого никогда не бывает. Как мне убедиться, что это так? Вот мой код...

BluetoothSocket btSocket;
String macAddress = data.getStringExtra("mac");
Log.d(TAG, "Found Device " + macAddress);

// Get the Bluetooth adapter on the device
BluetoothAdapter bta = ((MyApplication)this.getApplication()).getBtState();
BluetoothDevice btDevice = bta.getRemoteDevice(macAddress);
BluetoothSocket tmp = null;
try {
    tmp = btDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
} catch (IOException e) {
    e.printStackTrace();
}
if (tmp != null) {
    btSocket = tmp;
    bta.cancelDiscovery();

    try {
        btSocket.connect();
    } catch (IOException e) {
        try {
            Log.e(TAG, "------------- Close IOException");
            btSocket.close();
        } catch (IOException e2) {
            Log.e(TAG, "unable to close() socket during connection failure", e2);
        }
    }
}   

Вот ошибка, которую я тоже получаю:

ERROR/BluetoothEventLoop.cpp(149): event_filter: Received signal org.bluez.Adapter:DeviceCreated from /org/bluez/14284/hci0
ERROR/BluetoothEventLoop.cpp(149): event_filter: Received signal org.bluez.Adapter:PropertyChanged from /org/bluez/14284/hci0
ERROR/BluetoothEventLoop.cpp(149): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/14284/hci0/dev_00_02_5B_00_A5_0B
ERROR/BluetoothEventLoop.cpp(149): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/14284/hci0/dev_00_02_5B_00_A5_0B
DEBUG/BluetoothService(149): updateDeviceServiceChannelCache(00:02:5B:00:A5:0B)
DEBUG/BluetoothService(149):     uuid(application): 00001101-0000-1000-8000-00805f9b34fb 1
DEBUG/BluetoothService(149): Making callback for 00001101-0000-1000-8000-00805f9b34fb with result 1
VERBOSE/BluetoothEventRedirector(13691): Received android.bleutooth.device.action.UUID
ERROR/MainApp(14272): ------------- Close IOException
ERROR/BluetoothService.cpp(149): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)
ERROR/BluetoothEventLoop.cpp(149): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/14284/hci0/dev_00_02_5B_00_A5_0B
VERBOSE/BluetoothEventRedirector(13691): Received android.bleutooth.device.action.UUID

Одна странная вещь в этом, которая кажется ошибкой, заключается в том, что если я запускаю этот код и он дает сбой, то я выключаю Bluetooth и снова включаю его, устройство отображается как сопряженное в стеке. Насколько я понимаю, чип Bluetooth на myTouch — 2.1, а чип, к которому мы пытаемся подключиться, — 1.2.


person JPM    schedule 08.06.2011    source источник


Ответы (2)


В настоящее время у меня возникают проблемы с Bluetooth (с использованием SPP) на некоторых телефонах. Одна вещь, которую вы можете попробовать, это использовать отражение при создании сокета.

Я использовал Nexus S при разработке службы Bluetooth (на самом деле я использую метод listenUsingRfcommWithServiceRecord), он отлично работает на этом телефоне. Также отлично работает на SonyEricsson Xperia ARC и SonyEricsson X10 Mini Pro. Это не работало на HTC Wildfire (2.2.1), HTC Legend (2.2) и Samsung Galaxy S (2.2.1).

Я также должен упомянуть, что устройство, с которого я получаю данные, также использует Bluetooth 1.2, как и ваше, так что это не должно быть проблемой.

Когда я попытался использовать отражение, я внезапно преуспел в Wildfire, но, к сожалению, до сих пор нет прогресса ни в Legend, ни в Galaxy S. Здесь я застрял. Многие форумы утверждают, что у некоторых производителей есть проприетарный стек Bluetooth, поэтому я думаю, что это и является причиной этих проблем. В любом случае, удачи!

UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");

Method m = mAdapter.getClass().getMethod("createRfcommSocketToServiceRecord", new Class[] { UUID.class });
tmpSocket = (BluetoothServerSocket) m.invoke(mAdapter, new Object[] { MY_UUID });
person Fredricus    schedule 30.06.2011
comment
К сожалению, проприетарный стек bluetooth часто плохо реализован на многих устройствах. О, очень верно. - person Terrance; 01.07.2011
comment
Что ж, обновление Samsung Galaxy S до версии 2.3.3 устранило проблему для этого конкретного телефона без каких-либо изменений в приложении. Я предполагаю, что это демонстрирует, что проблема проприетарных стеков Bt существует. - person Fredricus; 04.07.2011
comment
Это хорошая информация, ребята, спасибо. Фредрикус, ты помнишь, какая версия была у твоего устройства до этого? - person TacB0sS; 09.01.2013

Опять же, это похоже на ошибку Bluetooth для этого телефона, другие телефоны с таким же чипом и версией BT не имеют этой проблемы.

person JPM    schedule 28.06.2011
comment
Привет, я столкнулся с той же проблемой, насколько вы уверены, что это проблема конкретного устройства? Я сталкивался с этим на нескольких устройствах, а также с этой проблемой: stackoverflow.com/questions/13520575/ - person TacB0sS; 08.01.2013
comment
Я слышу вас, я почти уверен, что это устройство и какая ОС вместе с чипом Bluetooth. Все зависит от того, как производитель интерпретирует спецификацию Bluetooth. Я видел это на нескольких телефонах Samsung, Motorola, LG и других, а также на разных телефонах. Это работает просто отлично. Это действительно хит или промах. Поэтому я пропустил все и обошел i, используя небезопасные соединения, если это возможно. - person JPM; 08.01.2013
comment
вы видели решение в моем посте? может это была ваша проблема? Какой из двух способов вы используете для включения Bluetooth в своем приложении? - person TacB0sS; 09.01.2013