Как создать небезопасный сокет RFCOMM в Android?
Я смотрю на способ подключения через сокет rfcomm небезопасно. Я смог найти путь, упомянутый ниже
Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);
Это в настоящее время делает то, что я хочу. Даже в документации здесь сказано, что нам нужно использовать createInsecureRfcommSocketToServiceRecord для небезопасных соединений. Но нет такого метода. Единственный способ, который я обнаружил, - это использовать отражение, как показано выше. И даже в том методе, который передается в createInsecureRfcommSocket, а не в createInsecureRfcommSocketToServiceRecord. Я просто хотел узнать, насколько надежен этот способ. Если я упоминаю createInsecureRfcommSocketToServiceRecord в методе, соединение никогда не происходит.
3 ответа
createInsecureRfcommSocketToServiceRecord()
был включен начиная с Android API Level 10, поэтому документация будет побуждать вас использовать его, так как документы всегда следуют последней версии API. Если вы нацеливаетесь на API ниже 10 (он же 2.3.3 или Gingerbread), тогда этот метод вам не доступен.
Метод, который вы вызываете с помощью отражения createInsecureRfcommSocket()
это частный метод внутри BluetoothDevice
это присутствует примерно с Android 2.0. Проблема с вызовом скрытых методов заключается в том, что они не гарантированно будут присутствовать на всех устройствах или в будущем... так что вы играете немного. Я предполагаю, что ваш метод, вероятно, будет работать большую часть времени на большинстве устройств 2.0+, так как сервисы, необходимые для реализации его общедоступного кузена createRfcommSocketToServiceRecord()
так похожи на уровне стека.
В итоге, если вы хотите гарантировать универсальную совместимость с вашей реализацией Bluetooth, вам нужно нацелиться на 2.3.3 (уровень API 10) с вашим приложением. С открытым API, теперь доступным для небезопасного RFCOMM, трудно сказать, является ли более или менее вероятным изменение базовой частной реализации.
Ну, большинство ответов здесь, до 30 марта 2011 года, в этом посте.
В поисках решения аналогичной проблемы в моем приложении я нашел этот блог, написанный 30 марта.
Это поможет всем тем, кто еще ищет решение этой проблемы на 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);
Это оно!