2015-09-23 66 views
0

我的Android應用程序應通過藍牙識別周圍是否有適當的arduino服務器。如果是這樣,應用程序將顯示敬酒消息,取決於所需的arduino服務器的存在。如果發現它應該發送關於該消息的消息,並且如果不是,則發送另一消息。在Android中使用BroadcastReceiver時無法獲得理想的吐司消息

這裏是我的代碼,當用戶按下按鈕,搜索Arduino的服務器:

public void onClick(View v) { 

      Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 
      if (pairedDevices.size() > 0) { 
       for (BluetoothDevice device : pairedDevices) { 
        if (device.getName().equals("ARD_SPP")) { 
         sendButton.setVisibility(View.VISIBLE); 
         Toast.makeText(ConnectActivity.this, "Arduino server found, please sign up", Toast.LENGTH_SHORT); 
         b = true; 
         break; 
        } 
       } 
      } 
      mBluetoothAdapter.startDiscovery(); 
      if (mBluetoothAdapter.startDiscovery()) { 
       registerReceiver(discoveryResult, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
      } 
      mBluetoothAdapter.cancelDiscovery(); 
      if (b == false) 
       Toast.makeText(ConnectActivity.this, "Server not found", Toast.LENGTH_SHORT).show(); 
      } 

這是裏面的BroadcastReceiver代碼:

BroadcastReceiver discoveryResult = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String deviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME); 
     if (deviceName.equals("ARD_SPP")) { 
      Toast.makeText(ConnectActivity.this, "Arduino server found, please sign up", Toast.LENGTH_SHORT).show();     
      b = true; 
     } 
    } 

(我沒有把一部分的代碼約藍牙,使它更容易閱讀,認爲藍牙已經打開)

問題是,即使服務器在附近,找不到服務器的消息。因此,首先顯示「未找到服務器」,然後顯示找到服務器的消息。我不知道如何解決這個問題。

我試着用布爾變量b。我在我的代碼裏面的不同地方使用了條件,在onClick和BroadcastReceiver中,但沒有給出適當的結果。也許我沒有用好的方式使用BroadcastReceiver ...

有沒有人有想法我可以解決這個問題?它喜歡解決方案很簡單,但我不明白。

+0

可能是這個Toast.makeText(ConnectActivity.this, 「Arduino的服務器發現,請立即註冊」,Toast.LENGTH_SHORT).show();替換爲Toast.makeText(上下文,「發現Arduino服務器,請註冊」,Toast.LENGTH_SHORT).show(); – Pavan

回答

0

發現過程是異步的,所以您必須等到您在您定義的BroadcastReceiver中獲得結果。這將在接下來的12秒內發生(它應該非常快,但這是BluetoothAdapter爲發現指定的窗口)。

所以基本上你的概念錯誤是假設這是同步的東西,並以這種方式編碼。

您應該:

1)擺脫mBluetoothAdapter.cancelDiscovery(),因爲這是取消正在進行的發現過程。

2)當b爲假時(btw將條件改爲if(!b)),不要顯示服務器未找到的消息,因爲那時的b變量可能只是由pairedDevices循環修改,據我所知,你不想顯示Arduino是否配對,但是如果它在附近。

3)要正確地管理您的發現過程得到的消息,你應該心裏有這個(從官方文檔http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html):

註冊ACTION_DISCOVERY_STARTED和ACTION_DISCOVERY_FINISHED 意圖來確定什麼時候發現開始並完成。 註冊ACTION_FOUND以在發現遠程藍牙設備 時收到通知。

所以基本上如果收到ACTION_FOUND,你應該檢查它是否是Arduino並顯示正確的消息。 如果在整個過程中最終收到ACTION_DISCOVERY_FINISHED而沒有找到它,則可以顯示「未找到」消息。

請務必先閱讀官方文檔,以更好地瞭解您正在做的事情。

希望它有幫助。

+0

謝謝Daniel,你給了我很好的提示。我明白你告訴我的是什麼,但在實現你的想法時,我仍然遇到一些問題。我會在你的建議之後發佈我寫的代碼,但是我在新問題中這樣做了,因爲我不知道如何在此處編輯該代碼並使其易於閱讀。 – MarkoDj

+0

這是我發佈新問題的鏈接:http://stackoverflow.com/questions/32780887/problems-with-searching-for-available-device-via-bluetooth-in-android – MarkoDj