2012-06-18 20 views
6

Tôi đang viết ứng dụng gửi mã byte từ máy tính bảng đến bộ điều khiển µ. Mọi thứ hoạt động tốt trên Lenovo A1 (Androi 2.3) và Samsung Galaxy Tab 7 Plus N (Android 3.2). Bây giờ tôi đang gặp vấn đề với Samsung Galaxy Tab 2 mới (Android 4.0).Kết nối Bluetooth trên Android ICS không thể

Tôi có thể ghép nối với ăng-ten Bluetooth (được kết nối với bộ điều khiển µ và giao tiếp qua giao thức nối tiếp). Khi tôi khởi động lại ứng dụng, tôi lại được yêu cầu nhập mật khẩu và ghép nối. Sau khi tôi nhập mật khẩu ghép nối, bố cục chính của tôi hiển thị nhưng kết nối không được thiết lập.

Các LogCat trong nhật thực nói với tôi:

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) 

Hơn nữa là LogCat nhận một ngàn lần so với thông điệp:

V/BluetoothSocket.cpp(3189): availableNative 

Vì vậy, như tôi đã tìm kiếm trong các trang web tôi tìm thấy một vài chàng trai với một vấn đề tương tự nhưng không có giải pháp. Có ai biết điều gì đó về vấn đề này không?

Có thể đó là sự cố tương thích giữa ăng-ten và Android 4.0. Tôi không nghĩ rằng lỗi là trong mã của tôi bởi vì như tôi đã nói cùng một mã đang chạy trên các phiên bản Android cũ hoàn hảo.

+0

bạn có giải quyết vấn đề này không? – PankajAndroid

Trả lời

4

Ok, tôi đã phát hiện ra vấn đề là gì. Tôi không chắc chắn nếu nó chỉ là một vấn đề Samsung hoặc một vấn đề ICS Android.

tôi đã cố gắng để kết nối với ăng ten như thường lệ bằng cách sử dụng (để có được Socket):

clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID); 

Vâng có vẻ như nó không hoạt động với ăng ten của tôi và thiết lập Tablet, vì vậy tôi cố gắng:

clientSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID); 

Tính năng này hoạt động. Tùy chọn thứ nhất buộc hệ thống hủy ghép ăng-ten và sau đó yêu cầu ghép nối lại.

+0

Wow, điều này đã giúp tôi! Cảm ơn! – Jaykob

2

Thực tế việc tạo ổ cắm không an toàn giống với việc kết nối hai thiết bị chưa ghép nối. Đây rõ ràng không phải là cách tốt nhất để xử lý nó.

Tôi nhận thấy rằng Android cố gắng sửa chữa thiết bị và sau đó nó từ chối phản hồi ghép nối. Sau hành vi bizzare này, nó sẽ chấp nhận nỗ lực kết nối tiếp theo!

Tôi cũng đã thử trình gỡ lỗi Android: Bluetooth RFCOMM Server Socket no longer connects properly to embedded device on ICS 4.0.3.

Vẫn đang chờ phản hồi ...

1

Tôi tin rằng tôi đang gặp vấn đề tương tự. Tôi đang sử dụng ứng dụng thiết bị đầu cuối spp từ Google play hoạt động hoàn hảo sau khi ghép nối thiết bị với cổ phiếu của tôi droid x. Nhưng bây giờ với thiên hà của tôi s3 với cùng một ứng dụng và cùng một thiết bị đòi hỏi tôi phải tái cặp mỗi lần.

Giải pháp của bạn là một cách giải quyết. Có vẻ như Android đã thay đổi hành vi này trong ICS. Vì vậy, sửa chữa thực sự là để Google sửa lỗi ICS để cho phép các thiết bị spp ghép nối và kết nối mà không cần ghép nối lại.

Nhưng, tôi đã nhìn thấy một số mã để giải quyết một vấn đề tương tự:

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

bạn có thể chỉnh sửa câu trả lời của riêng mình để bao gồm bất kỳ bổ sung nào bạn muốn. Chỉ cần nhấp vào liên kết "chỉnh sửa" nhỏ ở trên (phía dưới bên trái của câu trả lời). – davidcesarino

0

Sử dụng mã này:

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(); 
} 

và thêm dòng sau vào ứng dụng của chúng tôi Manifest làm việc

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

2

Nhờ @fuentessifuentes trả lời tôi đã viết phương pháp này includi ng khả năng tương thích ngược:

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); 
} 

Có thể nó sẽ giúp một ai đó thoát khỏi sự phát hành này.