Android-соединение Bluetooth Безопасный небезопасный - PullRequest
4 голосов
/ 27 ноября 2011

Я играл с Bluetooth API для Android 2.2 (уровень API 8, HTC Desire), и у меня было приложение, подключающееся к встроенному устройству Bluetooth с помощью:

device.createRfcommSocketToServiceRecord(DEV_UUID);

Это сгенерировало запрос на сопряжение, как и ожидалось, однако, чтобы упростить процесс соединения, я хотел избежать взаимодействия с пользователем, когда сопряжение перешло на уровень API 10 (HTC Desire с CyanogenMod 7), чтобы я мог использовать:

 device.createInsecureRfcommSocketToServiceRecord(DEV_UUID);

При тестировании это также работает должным образом (подключение без запроса пользователя на сопряжение), однако, когда я пытаюсь создать безопасный RfcommSocket на уровне API 10, как раньше, с 2.2 я получаю исключение об отказе в соединении ...

 java.io.IOException: Connection refused
    at android.bluetooth.BluetoothSocket.connectNative(Native Method)
    at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:204)

Насколько я могу судить, это все равно должно работать точно так же, предлагая пользователю выполнить сопряжение?

РЕДАКТИРОВАТЬ:

Просто попробовал еще раз, используя следующий код, и результат тот же (работает для небезопасных, но не для безопасных), я попытаюсь взять в свои руки устройство 2.3 для тестирования.

        try {
            Method m = dev.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class } );
            BluetoothSocket bs = (BluetoothSocket)m.invoke(dev, devUUID);
            Log.d("TEST", "Method Invoked");
            bs.connect();
            Log.d("TEST", "Connected to socket");
            bs.close();
            Log.d("TEST", "Closed Socket");
        }

1 Ответ

4 голосов
/ 28 декабря 2011

В поисках решения аналогичной проблемы в моем приложении я нашел этот блог с code.google.com

Это поможет всем тем, кто еще ищет решение этой проблемы на SO

http://mobisocial.stanford.edu/news/2011/03/bluetooth-reflection-and-legacy-nfc/ (ссылка больше не работает)

Решение стало очень простым. Просто включите InsecureBluetooth.java в свой проект и измените 2 строки в BluetoothChatService.java.

tmp = InsecureBluetooth.listenUsingRfcommWithServiceRecord(mAdapter, NAME, MY_UUID, true);

и

tmp   = InsecureBluetooth.createRfcommSocketToServiceRecord(device, MY_UUID, true);

Вот так!

...