2015-09-25 121 views
0

我的應用應該通過藍牙檢查周圍是否存在某個Arduino服務器,然後烘烤適當的消息。通過藍牙搜索可用設備的問題android

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

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 1111", Toast.LENGTH_SHORT); 
         break; 
        } 
       } 
      } 
      IntentFilter filter = new IntentFilter(); 
      filter.addAction(BluetoothDevice.ACTION_FOUND); 
      filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
      filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
      registerReceiver(discoveryResult, filter); 
      mBluetoothAdapter.startDiscovery(); 

      } 

和代碼內廣播接收器:

public void onReceive(Context context, Intent intent) { 
     Boolean b = false; 
     String action = intent.getAction(); 
     ProgressDialog dialog = new ProgressDialog(ConnectActivity.this); 
     if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){ 
      dialog.setMessage("Searching for Arduino server..."); 
      dialog.show(); 
     } 
     else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){ 
      dialog.dismiss(); 
      if (!b) 
       Toast.makeText(ConnectActivity.this, "Server not found", Toast.LENGTH_SHORT).show(); 
     } 
     else if (BluetoothDevice.ACTION_FOUND.equals(action)){ 
       String deviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME); 
       if (deviceName.equals("ARD_SPP")) { 
        Toast.makeText(ConnectActivity.this, "Arduino server found, please sign up 2222", Toast.LENGTH_SHORT).show(); 
        sendButton.setVisibility(View.VISIBLE); 
        openButton.setVisibility(View.GONE); 
        b = true; 
        dialog.dismiss(); 
       } 
     } 
    } 

我有三個問題與此有關。

首先,我遇到了「未找到服務器」消息的問題。即使在arduino在附近時也顯示出來。我真的不知道該把哪行放到我的代碼中。我試圖把它放在不同的代碼中,但我無法得到所需的代碼。

其次,找到服務器的消息顯示兩次。我在廣播接收器裏面敬酒,而不是在pairedDevices裏面敬酒(在這個之後我把1111識別出哪個麪包被顯示)。我不明白什麼是第二次執行該敬酒的代碼部分。

而且我還遇到了進度對話框的問題。我無法從屏幕上刪除對話框,即使找到服務器,它仍然存在。我將dialog.dismiss()放在發現完成的塊和找到的設備中,但它仍然在屏幕上。

有沒有人請幫助我?

回答

0

您每次收到意圖時都設置您的變量。

Boolean b = false; 
ProgressDialog dialog = new ProgressDialog(ConnectActivity.this); 

這不應該被放在OnReceived(),但必須設置好的爲您的廣播接收器的私有變量。 這樣做的進度不會消失,並且「服務器未找到」敬酒,因爲當您收到ACTION_DISCOVERY_FINISHED時b總是錯誤的,並且您嘗試關閉未顯示的progressDialog。

關於多次調用「發現服務器」調用兩次,請檢查當您不再需要時是否取消註冊您的BroadcastReceiver。

希望有所幫助。

編輯: 設置你的廣播接收器一樣的是,progressDialog應建立在ACTION_DISCOVERY_STARTED:

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    private boolean b = false; 
    private ProgressDialog dialog ; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){ 
      dialog = new ProgressDialog(ConnectActivity.this); 
      dialog.setMessage("Searching for Arduino server..."); 
      dialog.show(); 
     } 
     else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){ 
      dialog.dismiss(); 
      if (!b) 
       Toast.makeText(ConnectActivity.this, "Server not found", Toast.LENGTH_SHORT).show(); 
     } 
     else if (BluetoothDevice.ACTION_FOUND.equals(action)){ 
      String deviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME); 
      if (deviceName.equals("ARD_SPP")) { 
       Toast.makeText(ConnectActivity.this, "Arduino server found, please sign up 2222", Toast.LENGTH_SHORT).show(); 
       sendButton.setVisibility(View.VISIBLE); 
       openButton.setVisibility(View.GONE); 
       b = true; 
       dialog.dismiss(); 
      } 
     } 
    } 
} 
+0

我搬到那三行OnReceived()之外,實際上只是上面的行公共無效的onReceive()但隨後應用程序崩潰。我收到該應用停止的消息。我現在完全混淆了,代碼中的一切都是一樣的,只是我移動了這三行。這是怎麼回事? – MarkoDj

+0

對不起,我忘了告訴你改變progressDialog創建的位置。查看我的編輯帖子以獲取更多信息。 –

+0

現在正在工作,我確實喜歡你在編輯答案中說過。非常感謝你! – MarkoDj