2013-07-20 44 views
11

Tôi đã gặp sự cố này một lúc và không thể tìm ra được.bluetooth android không thể kết nối

Tôi có một ứng dụng Android đặt tất cả các thiết bị được ghép nối trong một chế độ xem danh sách. Khi bạn nhấp vào một trong các mục danh sách, nó sẽ bắt đầu yêu cầu kết nối với thiết bị bluetooth đó.

Tôi có thể nhận được danh sách các thiết bị có địa chỉ của họ không thành vấn đề. Vấn đề là một khi tôi cố gắng kết nối tôi nhận được một IOException trên socket.connect();

Các thông báo lỗi như sau: "connect đọc thất bại, ổ cắm có thể đóng cửa hoặc thời gian chờ, đọc ret: -1"

Đây là mã của tôi. ANY đề xuất sẽ được đánh giá cao. Tôi khá mắc kẹt về điều này.

fyi: phương thức "onEvent" là thư viện giúp đơn giản hóa gọi lại ... phần đó hoạt động. Khi người dùng nhấp vào một mục danh sách phương pháp này được gọi là "public void onEvent (EventMessage.DeviceSelected sự kiện)"

public class EcoDashActivity extends BaseActivity { 

public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 


private BluetoothAdapter mBluetoothAdapter; 
private int REQUEST_ENABLE_BT = 100; 
private ArrayList<BluetoothDevice> mDevicesList; 
private BluetoothDeviceDialog mDialog; 
private ProgressDialog progressBar; 
private int progressBarStatus = 0; 
private Handler progressBarHandler = new Handler(); 


@Override 
public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.main); 

    mDevicesList = new ArrayList<BluetoothDevice>(); 

    // Register the BroadcastReceiver 
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
    registerReceiver(mReceiver, filter); 

    setupBluetooth(); 
} 

private void setupBluetooth() { 
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
    if (mBluetoothAdapter == null) { 
     // Device does not support Bluetooth 
     Toast.makeText(this, "Device does not support Bluetooth", Toast.LENGTH_SHORT).show(); 
    } 

    if (!mBluetoothAdapter.isEnabled()) { 
     Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
    } else { 
     searchForPairedDevices(); 
     mDialog = new BluetoothDeviceDialog(this, mDevicesList); 
     mDialog.show(getFragmentManager(), ""); 
    } 

} 

private void searchForPairedDevices() { 

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 
    // If there are paired devices 
    if (pairedDevices.size() > 0) { 
     // Loop through paired devices 
     for (BluetoothDevice device : pairedDevices) { 
      // Add the name and address to an array adapter to show in a ListView 
      mDevices.add(device.getName() + "\n" + device.getAddress()); 
      mDevicesList.add(device); 
     } 
    } 
} 


private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     // When discovery finds a device 
     if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
      // Get the BluetoothDevice object from the Intent 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      // Add the name and address to an array adapter to show in a ListView 
      mDevicesList.add(device); 
     } 
    } 
}; 


@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    unregisterReceiver(mReceiver); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
if (requestCode == REQUEST_ENABLE_BT) { 
     if (resultCode == RESULT_OK) { 
      Toast.makeText(this, "BT turned on!", Toast.LENGTH_SHORT).show(); 
      searchForPairedDevices(); 

      mDialog = new BluetoothDeviceDialog(this, mDevicesList); 
      mDialog.show(getFragmentManager(), ""); 
     } 
    } 

    super.onActivityResult(requestCode, resultCode, data); 
} 


public void onEvent(EventMessage.DeviceSelected event) { 

    mDialog.dismiss(); 

    BluetoothDevice device = event.getDevice(); 

    ConnectThread connectThread = new ConnectThread(device); 
    connectThread.start(); 
} 


public class ConnectThread extends Thread { 
    private final BluetoothSocket mmSocket; 
    private final BluetoothDevice mmDevice; 

    public ConnectThread(BluetoothDevice device) { 
     // Use a temporary object that is later assigned to mmSocket, 
     // because mmSocket is final 
     BluetoothSocket tmp = null; 
     mmDevice = device; 

     // Get a BluetoothSocket to connect with the given BluetoothDevice 
     try { 
      // MY_UUID is the app's UUID string, also used by the server code 
      tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 
     } catch (IOException e) { } 
     mmSocket = tmp; 
    } 

    public void run() { 
     setName("ConnectThread"); 
     // Cancel discovery because it will slow down the connection 
     mBluetoothAdapter.cancelDiscovery(); 

     try { 
      // Connect the device through the socket. This will block 
      // until it succeeds or throws an exception 
      Log.d("kent", "trying to connect to device"); 
      mmSocket.connect(); 
      Log.d("kent", "Connected!"); 
     } catch (IOException connectException) { 
      // Unable to connect; close the socket and get out 
      try { 
       Log.d("kent", "failed to connect"); 

       mmSocket.close(); 
      } catch (IOException closeException) { } 
      return; 
     } 

     Log.d("kent", "Connected!"); 
    } 

    /** Will cancel an in-progress connection, and close the socket */ 
    public void cancel() { 
     try { 
      mmSocket.close(); 
     } catch (IOException e) { } 
    } 
} 

Đây là logcat của tôi. Khá ngắn.

07-22 10:37:05.129: DEBUG/kent(17512): trying to connect to device 
07-22 10:37:05.129: WARN/BluetoothAdapter(17512): getBluetoothService() called with no BluetoothManagerCallback 
07-22 10:37:05.129: DEBUG/BluetoothSocket(17512): connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[98]} 
07-22 10:37:40.757: DEBUG/dalvikvm(17512): GC_CONCURRENT freed 6157K, 9% free 62793K/68972K, paused 7ms+7ms, total 72ms 
07-22 10:38:06.975: DEBUG/kent(17512): failed to connect 
07-22 10:38:06.975: DEBUG/kent(17512): read failed, socket might closed or timeout, read ret: -1 

Dòng cuối cùng nằm trong phần "Catch" của try/catch ... Tôi vừa đăng nhập thông báo lỗi.

Xin lưu ý, có khoảng một khoảng cách thứ hai 20 giữa "cố gắng để kết nối với thiết bị" và "không thể kết nối"

+0

Phiên bản Android nào? Có thể là một vấn đề ngăn xếp với Jelly đậu có một ngăn xếp bluetooth hoàn toàn khác nhau, unpair và thử ghép nối đầu tiên và sau đó thử lại – Slartibartfast

+0

post logcat cũng – Slartibartfast

+0

@Slartibartfast Tôi hiện đang làm việc trên 4.2.2 Nexus 4. Tôi sẽ cập nhật câu hỏi với logcat. –

Trả lời

14

Các Jelly Bean bluetooth stack là rõ rệt khác biệt so với các phiên bản khác.

này có thể giúp: http://wiresareobsolete.com/wordpress/2010/11/android-bluetooth-rfcomm/

Trong ý chính: Các UUID là một giá trị mà phải trỏ đến một dịch vụ xuất bản trên thiết bị nhúng của bạn, nó không phải là tạo ra chỉ là ngẫu nhiên. Kết nối SPP RFCOMM mà bạn muốn truy cập có một UUID cụ thể mà nó xuất bản để xác định dịch vụ đó và khi bạn tạo một socket, nó phải khớp với cùng một UUID.

Nếu bạn đang nhắm mục tiêu 4.0.3 thiết bị trở lên, hãy sử dụng fetchUuidsWithSdp()getUuids() để tìm tất cả các dịch vụ đã xuất bản và giá trị UUID được liên kết của chúng. Để có tính tương thích ngược, hãy đọc bài viết

+0

GetUUIDs() trả về một danh sách các id. Làm thế nào để bạn biết cái nào nên được sử dụng? –

+0

Tôi chỉ thử mọi UUID mà nó trả về và có cùng một vấn đề. –

+0

Bạn có biết một ví dụ mã hoàn chỉnh mà tôi có thể sao chép/dán vào một ứng dụng mới để chỉ kiểm tra nó? –

0

Tôi nhận được thông báo lỗi tương tự sau khi kết nối ổ cắm lần thứ hai. Tôi chỉ cần kiểm tra xem ổ cắm đã được kết nối chưa.

if(!mmSocket.isConnected()) 
      mmSocket.connect(); 

Tôi đã thử nghiệm trên Android 4.4.2 (Moto G).

Các vấn đề liên quan