2013-03-05 49 views
0

我目前正在尝试解决我遇到的需要蓝牙连接的Android应用程序的问题。一时之间,一切似乎都正常,但当我想连接的从属蓝牙设备未通电时,我注意到一些奇怪的事情。这里是我的代码:经过漫长的等待时间蓝牙插座状态混合ups

private void connectDevice() { 
    mBluetoothAdapter.cancelDiscovery(); 
    BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); 
    try { 
     btSocket = createBluetoothSocket(device); 
    } catch (IOException e) { 
     errorExit("Fatal Error", "Socket create failed: " + e.getMessage() + "."); 
    } 


    //Try to establish the connection. This will block until it connects. 
    Log.d(TAG, "...Connecting..."); 
    try { 
     btSocket.connect(); 
     Log.d(TAG, "....Connection ok..."); 
    } catch (IOException e) { 
     try { 
     btSocket.close(); 
     } catch (IOException e2) { 
     errorExit("Fatal Error", "Unable to close socket during connection failure" + e2.getMessage() + "."); 
     } 
    } 

    //Create a data stream so we can talk to server. 
    Log.d(TAG, "...Create Socket..."); 
    mConnectedThread = new ConnectedThread(btSocket); 
    mConnectedThread.start(); 
    mActionBar.setSubtitle("Connected"); 

    return; 
    } 

这里是我调用这个方法:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch(requestCode){ 
    case REQUEST_ENABLE_BT: 
     if (resultCode == RESULT_OK) { 
      Toast.makeText(this, R.string.bt_enabled, Toast.LENGTH_SHORT).show(); 
      setupCom(); 
      break; 
     } 
     else { 
      // User did not enable Bluetooth or an error occurred 
      if(D) Log.d(TAG, "BT not enabled"); 
      Toast.makeText(this, R.string.bt_not_enabled_leaving, Toast.LENGTH_SHORT).show(); 
      finish(); 
      break; 
     } 
    case REQUEST_CONNECT_DEVICE: 
     if (resultCode == RESULT_OK){ 
      retrieveAddresse(data); 
      connectDevice(); 
     } 
     break; 
    } 
    return; 
} 

我的问题是,当我不在范围内或我要连接的设备不启动时,connectDevice()方法似乎执行所有代码,即使无法连接也是如此,因为Android OS不希望被连接进程阻塞。我注意到这个问题,因为mActionBar.setSubtitle(“连接”);得到执行,因为当我在范围内时或者从蓝牙模块打开时尝试重新连接。我无法连接到它,除非我重新启动我的应用程序。

+0

如何获取设备地址?使用蓝牙发现? – 2013-03-05 02:35:15

+0

该地址由一个DeviceListActivity类检索,该类给出了列表中的所有设备,我选择了一个设备,并提取了这部分工作的地址。 – Mathieu660 2013-03-05 02:40:31

+0

正确的你是正确的线程。但是,如果我无法连接,为什么我会获得连接状态? – Mathieu660 2013-03-05 02:43:00

回答

0

把这些行:

mConnectedThread = new ConnectedThread(btSocket); 
mConnectedThread.start(); 
mActionBar.setSubtitle("Connecté"); 

第一次尝试中。这样它们只有在设备建立连接时才会执行。实际上,它们在try/catch之外,即使没有连接,它们也会一直执行。