2013-03-05 52 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之外,即使沒有連接,它們也會一直執行。