Android Bluetooth не показывает диалог сопряжения - PullRequest
6 голосов
/ 08 июня 2011

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

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

.

Ответы [ 2 ]

4 голосов
/ 30 июня 2011

В настоящее время у меня проблемы с 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 });
1 голос
/ 28 июня 2011

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

...