BluetoothServerSocket принимает сбой и выдает IOException
У меня есть устройство, которое поддерживает OBEX Object Push Profile, этот профиль основан на профиле последовательного порта. Я предполагаю, что я могу использовать пример Android Bluetooth Chat для подключения этого устройства к моему телефону Android. Но я столкнулся с проблемой, касающейся socket.accept()
функциональность в андроид SDK. Я пытаюсь выполнить соединение моего телефона с этим устройством следующим образом:
adapter = BluetoothAdapter.getDefaultAdapter();
device = adapter.getRemoteDevice("00:1B:DC:0F:EC:7E");
AcceptThread = new AcceptThread(true, adapter, device);
AcceptThread.start();
Конструктор в AcceptThread кодируется так:
public AcceptThread(boolean secure, BluetoothAdapter adapter, BluetoothDevice device) {
BluetoothServerSocket tmp = null;
this.adapter = adapter;
this.device = device;
// Create a new listening server socket
try {
tmp = adapter.listenUsingInsecureRfcommWithServiceRecord(device.getName(), UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
} catch (Exception e) {
Log.e(TAG, ".AcceptThread # listen() failed", e);
}
mmServerSocket = tmp;
}
Проблема в том, когда я пытаюсь сделать connect()
как я сказал ранее
public void run() {
BluetoothSocket socket = null;
// Listen to the server socket if we're not connected
while (mState != STATE_CONNECTED) {
try {
// This is a blocking call and will only return on a
// successful connection or an exception
Log.d(TAG, "AcceptThread.run: accepting server socket connection");
socket = mmServerSocket.accept(20000);
Log.d(TAG, ".AcceptThread.run # server socket connection accepted");
} catch (Exception e) {
Log.e(TAG, ".run # accept() failed: "+e);
break;
}
}
}
Как вы можете видеть, ServerSocket принимает каждое входящее соединение для 20 seconds
или же 20000 ms.
Когда время истечет, приложение выдаст IOException, как это
07-11 10:30:08.355: E/SIMPLECONNECT(1301): .run # accept() failed: java.io.IOException: Connection timed out
который говорит мне, что мое устройство не может подключиться к моему телефону Android. Устройство не имеет кнопки подключения на дисплее, просто функция отправки, которая отправит файл на мой телефон. Я считаю, что эта функция отправки также делает подключение в фоновом режиме, но я не уверен.
Кто-нибудь может определить какие-либо решения для меня? Я запускаю свое приложение на Samsung Galaxy SIII
с Android 4.0.4
1 ответ
Я наконец-то решил, проблема в том, что разные версии Android и разные устройства, похоже, нуждаются в разных сокетах. Я попробовал это с Samsung Galaxy XCOVER, Tab1, Tab2, Nexus, Note, Motorola Defy и HTC Flyer. Сокеты, которые я использовал:
A:
Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
mSocket = (BluetoothSocket) m.invoke(mmDevice, Integer.valueOf(1));
B:
Method m = mmDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[]{int.class});
mSocket=(BluetoothSocket)m.invoke(mmDevice,Integer.valueOf(1));
C:
mSocket=BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mmDevice.getAddress()).createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
Android 4.0.x работает на Nexus, Flyer,Tab1 с A,B Android 4.0.3 работает на Tab2 с B Android 3,6,x работает на DEFY с A,B Android 2.3.6 работает на XCOVER с C
Я не могу найти решение, которое работает для всех устройств, и я не могу определить, будет ли работать ведьма-сокет до того, как я создаю и использую Socket, особенно XCOVER выполняет connect() для всех сокетов без исключения, но поймать, если я попробую tro write(). Так что, если вы хотите установить подключение bloothoh, которое работает для всех устройств, вам нужно создать сокеты, подключить запись и затем запомнить сокет, который работает (например, в настройках)