Кто-нибудь знает, как создать небезопасное соединение RFCOMM между двумя устройствами Android на уровне API 2.3.3 при использовании произвольно объявленного имени службы? (не случайное или не меняющееся имя службы, просто имя службы, котороеЯ определяю себя)
Подробности
Я пытаюсь создать небезопасное соединение Rfcomm между двумя устройствами Android: Droid X2 и Asus Transformer.Я предполагаю, что оба эти устройства имеют функциональность на уровне Android 2.3.3, чтобы фактически получить возможность использовать небезопасный Rfcomm.
Когда я пытаюсь создать соединение Bluetooth, как описано здесь используя теперь общедоступные createInsecureRfcommSocketToServiceRecord () и listenUsingInsecureRfcommWithServiceRecord (SERVICE, UUID), я получаю сообщение:
java.io.IOException: Service discovery failed
at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:377)
at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:201)
at com.s4d.bluenomad.DeviceConnections$ClientThread.run(DeviceConnections.java:406)
Я нашел связанный вопрос , где кто-то, создавший нормальное соединение, получалэта ошибка и используется отражение для вызова частного метода.Однако я понятия не имею, какой приватный метод теперь будет соответствовать инициации «небезопасного» соединения.Я попытался использовать решение, предложенное в этом связанном вопросе, но Android попросил меня соединить устройства, и это именно то, чего мне нужно избегать.Мне действительно нужен небезопасный подход.
Я даже попробовал комбинацию официальных и взломанных решений, обозначенных здесь
Соответствующие фрагменты кода
Создание ServerThread для прослушивания соединений
Log.i(TAG, "Constructing a ServerThread");
// Use a temporary object that is later assigned to serverSocket,
// because serverSocket is final
BluetoothServerSocket tmp = null;
try {
// MY_UUID is the app's UUID string, also used by the client code
tmp = btAdapter.listenUsingInsecureRfcommWithServiceRecord(SERVICE_NAME, SERVICE_UUID);
Log.i(TAG,"Started listening on insecure RFCOMM channel for service requests for: " + SERVICE_NAME);
} catch (IOException e) { }
serverSocket = tmp;
ServerThread Прослушивание соединений
BluetoothSocket socket;
while(true)
{
try
{
socket = serverSocket.accept();
}
catch( IOException e)
{
break;
}
if( socket != null )
{
Log.i(TAG, "Received new socket connection requesting service: " + SERVICE_NAME);
}
else
{
Log.i(TAG, "Socket connection attempted, but socket received is NULL.");
}
}
Создание ClientThread для инициации соединений
Log.i(TAG, "Constructing a ClientThread");
BluetoothSocket tmp = null;
try {
// MY_UUID is the app's UUID string, also used by the server code
tmp = device.createInsecureRfcommSocketToServiceRecord(SERVICE_UUID);
Log.i(TAG,"Created client socket on insecure RFCOMM channel for service requests for: " + SERVICE_NAME);
}
catch (IOException e)
{
Log.i(TAG, "Failed to createInsecureRfcommSocket() against MAC: " + device.getAddress());
}
clientSocket = tmp;
ClientThread Подключение к серверу
try
{
clientSocket.connect();
}
catch( final IOException e)
{
DeviceConnections.this.runOnUiThread(new Runnable()
{
@Override
public void run()
{
console.append("Client unable to connect to service.");
Log.i(TAG, "Client socket unable to connect() to: " + clientSocket.getRemoteDevice().getAddress());
e.printStackTrace();
}
});
}
Я получаю вывод журнала "Клиентский сокет не может подключиться () к: [MY_MAC_ADDRESS]", затем яполучить трассировку стека для исключения «Обнаружение службы не удалось».