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

 2red1306 авг. 2012 г., 20:06
та же проблема с Samsung Xcover, похоже, проблема Samsung, потому что мои другие устройства работают хорошо с тем же кодом. Я сообщил об этой проблеме в службу поддержки Samsung, но я не с нетерпением жду ... поэтому я начну маленькую награду.

Ответы на вопрос(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, которое работает для всех устройств, вам нужно создать сокеты, подключить запись и затем запомнить сокет, который работает (например, в настройках)

 18 сент. 2012 г., 08:14
Я не сохраняю сокет, но целое число. Затем у меня есть switch () в OnCreate и решить, какой сокет я использую, и OptionMenu, чтобы изменить сокет.
 14 сент. 2012 г., 20:54
Не могли бы вы поделиться, как вы пишете предпочтения? Я не могу сохранить сокет в настройках, потому что он сохраняет только числа, логические и строковые значения.

Ваш ответ на вопрос