2012-06-18 3 views
6

Я пишу приложение, которое отправляет байт-коды с планшета на μ-контроллер. Все отлично работало на Lenovo A1 (Androi 2.3) и Samsung Galaxy Tab 7 Plus N (Android 3.2). Теперь у меня проблемы с новой вкладкой Samsung Galaxy Tab 2 (Android 4.0).Соединение Bluetooth на Android ICS невозможно

Я могу соединиться с антенной Bluetooth (которая подключена к μ-контроллеру и передает через последовательный протокол). Когда я запустил приложение, меня снова попросят ввести пароль и соединить. После ввода пароля сопряжения мой основной макет отображается, но соединение не установлено.

LogCat в затмении говорит мне:

06-19 16:00:20.656: V/BluetoothSocket.cpp(3189): availableNative 
06-19 16:00:20.664: V/BluetoothSocket.cpp(3189): abortNative 
06-19 16:00:20.664: V/BluetoothSocket.cpp(3189): ...asocket_abort(49) complete 
06-19 16:00:20.664: I/ActivityManager(185): No longer want com.google.android.partnersetup (pid 3220): hidden #16 
06-19 16:00:20.671: V/BluetoothSocket.cpp(3189): availableNative 
06-19 16:00:20.671: V/BluetoothSocket.cpp(3189): destroyNative 
06-19 16:00:20.671: V/BluetoothSocket.cpp(3189): ...asocket_destroy(49) complete 
06-19 16:00:20.679: D/KeyguardViewMediator(185): setHidden false 
06-19 16:00:20.679: W/System.err(3189): java.io.IOException: socket closed 
06-19 16:00:20.679: W/System.err(3189):  at android.bluetooth.BluetoothSocket.available(BluetoothSocket.java:370) 
06-19 16:00:20.679: W/System.err(3189):  at android.bluetooth.BluetoothInputStream.available(BluetoothInputStream.java:40) 
06-19 16:00:20.679: W/System.err(3189):  at java.io.BufferedInputStream.available(BufferedInputStream.java:114) 
06-19 16:00:20.687: W/System.err(3189):  at ebs.alphadidact.control.ReceiveThread.run(ReceiveThread.java:79) 

Дальше больше является LogCat прием в тысячу раз сообщение:

V/BluetoothSocket.cpp(3189): availableNative 

Так как я искал в Интернете я нашел несколько парней с аналогичная проблема, но не решение. Кто-нибудь знает что-то об этой проблеме?

Возможно, это проблема совместимости антенны с Android 4.0. Я не думаю, что ошибка в моем коде, потому что, как я сказал, тот же код работает на старых версиях Android отлично.

+0

Вы решили это? – PankajAndroid

ответ

4

Хорошо, я выяснил, в чем проблема. Я не уверен, что это проблема Samsung или проблема ICS для Android.

Я пытался подключить к антенне, как обычно, с помощью (чтобы получить гнездо):

clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID); 

Ну, кажется, что он не работает с моей антенны и настройки планшета, так что я пробовал:

clientSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID); 

Это действительно работает. Первый параметр заставил систему отключить антенну, а затем снова попросить спаривания.

+0

Вау, это помогло мне! Благодаря! – Jaykob

2

Фактически создание небезопасного сокета аналогично подключению двух неспаренных устройств. Это явно не лучший способ справиться с этим.

Я обнаружил, что Android пытается восстановить устройство, а затем отклоняет ответ на сопряжение. После этого поведения bizzare он примет следующую попытку подключения!

Я также попробовал bugtracker Android: Bluetooth RFCOMM Server Socket no longer connects properly to embedded device on ICS 4.0.3.

Все еще жду ответа ...

1

Я считаю, что я вижу ту же проблему. Я использую приложение spp terminal из игры Google, которое отлично работало после сопряжения устройства с моим дроидом x. Но теперь, когда моя галактика s3 с одним и тем же приложением и тем же устройством требует от меня повторной пары каждый раз.

Ваше решение является своего рода обходным решением. Кажется, андроид изменил это поведение в ICS. Таким образом, реальное исправление заключается в том, что Google исправляет ICS, чтобы устройства spp могли соединяться и соединяться без спаривания.

Но я видел код для решения аналогичной проблемы:

BluetoothSocket mSocket = null; 
mBluetoothAdapter.cancelDiscovery(); 
Method method; 
try { 
    method = mBluetoothDevice.getClass() 
     .getMethod("createRfcommSocket", new Class[] { int.class}); 
    mSocket = (BluetoothSocket) method.invoke(mBluetoothDevice,1); 
} catch (NoSuchMethodException e1) { 
    e1.printStackTrace(); 
} catch (IllegalArgumentException e) { 
    e.printStackTrace(); 
} catch (IllegalAccessException e) { 
    e.printStackTrace(); 
} catch (InvocationTargetException e) { 
    e.printStackTrace(); 
} 

mSocket.connect(); 
+0

вы можете отредактировать свой собственный ответ, чтобы включить любые дополнения, которые вы хотите. Просто нажмите маленькую ссылку «изменить» выше (внизу слева от ответа). – davidcesarino

0

Используя этот код:

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); 
mBluetoothAdapter.cancelDiscovery(); 

Method m; 
try { 
    m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] { int.class }); 
    btSocket = (BluetoothSocket) m.invoke(device, 1); 
} catch (SecurityException e1) { 
    e1.printStackTrace(); 
} catch (NoSuchMethodException e1) { 
    e1.printStackTrace(); 
} catch (IllegalArgumentException e) { 
    e.printStackTrace(); 
} catch (IllegalAccessException e) { 
    e.printStackTrace(); 
} catch (InvocationTargetException e) { 
    e.printStackTrace(); 
} 

и добавив следующую строку в нашем приложении Manifest работал

<uses-sdk android:minSdkVersion="13" android:targetSdkVersion="16"/>

2

Благодаря @fuentessifuentes ответ я написал этот метод includesi ng обратная совместимость:

private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException { 
    if(Build.VERSION.SDK_INT >= 10){ 
     try { 
      final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class }); 
      return (BluetoothSocket) m.invoke(device, SPP_UUID); 
     } catch (Exception e) { 
      Log.e(TAG, "Could not create Insecure RFComm Connection",e); 
     } 
    } 
    return device.createRfcommSocketToServiceRecord(SPP_UUID); 
} 

Возможно, это помогает кому-то из этой эмиссии.

 Смежные вопросы

  • Нет связанных вопросов^_^