2017-08-05 102 views
0

我正在做一个蓝牙应用程序,我连接任何设备并做一些工作。我有很多活动。我在BlutoothConnectionService.java课中做了所有连接材料。在我的BondedDevicesActivity中,单击我想要连接的设备。然后服务工作,并打开另一个活动。然后我点击一些按钮打开另一个活动。在所有活动中,我都通过蓝牙发送一些信息。因此,无论何时我打开另一个活动,我都使用BlutoothConnectionService.java类。问题在于这个类,它总是试图连接到设备。我希望一旦连接完成,它就再也不会尝试它,直到连接死亡。但我无法弄清楚如何做到这一点。我知道有一种叫做isConnected()的方法,但我不知道把它放在服务类中。这里是我的服务代码:蓝牙IsConnected()

public class BluetoothConnectionService { 
private static final String TAG = "BluetoothConnectionSrvc"; 
private static final UUID connectionUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
private final BluetoothAdapter bluetoothAdapter; 
Context ctx; 
private ConnectThread connectThread; 
private BluetoothDevice bluetoothDevice; 
private UUID deviceUUID; 
ProgressDialog progressDialog; 
private ConnectedThread connectedThread; 
String incomingMessage; 

public BluetoothConnectionService(Context context, BluetoothDevice device, UUID uuid) { 
    bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
    ctx = context; 
    startClient(device, uuid); 
} 

public void startClient(BluetoothDevice device, UUID uuid) { 
    Log.d(TAG, "startClient: Started."); 
    connectThread = new ConnectThread(device, uuid); 
    connectThread.start(); 
} 

private class ConnectThread extends Thread { 
    private BluetoothSocket bluetoothSocket; 

    public ConnectThread(BluetoothDevice device, UUID uuid) { 
     Log.d(TAG, "ConnectThread: started."); 
     bluetoothDevice = device; 
     deviceUUID = uuid; 
    } 

    public void run() { 
     Log.i(TAG, "ConnectThread: Run."); 
     BluetoothSocket tmp = null; 
     try { 
      Log.d(TAG, "ConnectThread: Trying to create RFcommSocket using UUID: " + connectionUUID); 
      tmp = bluetoothDevice.createRfcommSocketToServiceRecord(deviceUUID); 
      progressDialog = ProgressDialog.show(ctx, "Cihaza Bağlanılıyor", "Lütfen Bekleyiniz...", true); 
     } catch (Exception e) { 
      progressDialog.dismiss(); 
      e.printStackTrace(); 
      Log.e(TAG, "ConnectThread: Couldn't create RFcommSocket" + e.getMessage()); 
      showMessage("Cihaza bağlanılamadı, lütfen bağlantınızı kontrol ederek tekrar deneyiniz."); 
      AnaEkranActivity.instance.finish(); 
     } 

     if (tmp != null) { 
      bluetoothSocket = tmp; 
      bluetoothAdapter.cancelDiscovery(); 

      try { 
       bluetoothSocket.connect(); 
       Log.d(TAG, "run: ConnectionThread connected."); 
       connected(bluetoothSocket); 
      } catch (Exception e) { 
       progressDialog.dismiss(); 
       e.printStackTrace(); 
       showMessage("Cihaza bağlanılamadı, lütfen bağlantınızı kontrol ederek tekrar deneyiniz."); 
       AnaEkranActivity.instance.finish(); 
       try { 
        bluetoothSocket.close(); 
        Log.d(TAG, "run: Closed Socket."); 
       } catch (Exception e1) { 
        e1.printStackTrace(); 
        Log.e(TAG, "ConnectThread: run: Unable to close connection in socket" + e1.getMessage()); 
       } 
       Log.d(TAG, "run: ConnectThread: Could not connect to UUID: " + connectionUUID); 
      } 
     } 
    } 
} 

public void connected(BluetoothSocket socket) { 
    Log.d(TAG, "Connected: Starting."); 
    connectedThread = new ConnectedThread(socket); 
    connectedThread.start(); 
} 

private class ConnectedThread extends Thread { 
    private final BluetoothSocket bluetoothSocket; 
    private final InputStream inputStream; 
    private final OutputStream outputStream; 

    public ConnectedThread(BluetoothSocket socket) { 
     Log.d(TAG, "ConnectedThread: Starting."); 
     bluetoothSocket = socket; 
     InputStream tmpIn = null; 
     OutputStream tmpOut = null; 

     try { 
      progressDialog.dismiss(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     try { 
      tmpIn = bluetoothSocket.getInputStream(); 
      tmpOut = bluetoothSocket.getOutputStream(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     inputStream = tmpIn; 
     outputStream = tmpOut; 
    } 

    public void run() { 
     byte[] readBuffer = new byte[1024]; 
     int readBytes; 

     while (true) { 
      try { 
       readBytes = inputStream.read(readBuffer); 
       incomingMessage = new String(readBuffer, 0, readBytes); 
       Log.d(TAG, "InputStream: " + incomingMessage); 
       showMessage(incomingMessage); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       Log.e(TAG, "read: Error reading from inputStream." + e.getMessage()); 
       showMessage("Connection is dead."); 
       AnaEkranActivity.instance.finish(); 
       break; 
      } 
     } 
    } 

    public void write(byte[] writeBytes) { 
     String text = new String(writeBytes, Charset.defaultCharset()); 
     Log.d(TAG, "write: Writing to outputStream: " + text); 
     try { 
      outputStream.write(writeBytes); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.e(TAG, "write: Error writing to outputStream." + e.getMessage()); 
      showMessage("Error while writing."); 
     } 
    } 
} 

public void write (byte[] out) { 
    Log.d(TAG, "write: Write Called."); 
    connectedThread.write(out); 
} 

public String read() { 
    Log.d(TAG, "read: Read Called."); 
    connectedThread.run(); 
    return incomingMessage; 
} 

public void showMessage(final String toastMessage) { 
    AnaEkranActivity.instance.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      Toast.makeText(ctx, toastMessage, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

}

任何想法?

回答

0

在android文档中,你会得到这个答案。我们在蓝牙聊天应用程序中使用相同的东西。这里是链接Bluetooth chat app

它给你提供有关连接的信息。并且this explanation

会帮你解决这个问题。一次清楚地通过你会得到解决方案。

+0

不幸的是,我深入研究了这些文档,但对于我的问题绝对没有任何用处。 – Burak