2016-07-12 31 views
0

Ich versuche, eine Verbindung zu einem Bluetooth-Gerät in meiner Android-Anwendung, aber ich habe ein Problem. Es sieht so aus, als ob ich beim ersten Versuch nie eine Verbindung zum Bluetooth-Gerät herstellen kann.Android-Bluetooth-Verbindung kann nicht beim ersten Versuch festgestellt werden

Ich habe den folgenden Code in der BluetoothConnectThread:

public class BluetoothConnectThread extends Thread { 
    private BluetoothSocket mmSocket; 
    private BluetoothDevice mmDevice; 
    private Context context; 
    private BluetoothManager manager; 

    public BluetoothConnectThread(BluetoothDevice mmDevice, UUID uuid, Context context, BluetoothManager manager) { 
     this.context = context; 
     this.manager = manager; 
     this.mmDevice = mmDevice; 
     this.uuid = uuid; 
    } 

    public void run() { 
     try { 
      System.out.println("Try to connect"); 
      mmSocket = (BluetoothSocket) mmDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class}).invoke(mmDevice, Integer.valueOf(1)); 
      mmSocket.connect(); 
     } catch (Exception connectException) { 
      connectException.printStackTrace(); 
      try { 
       mmSocket.close(); 
       System.out.println("Couldn't establish Bluetooth connection! (1)"); 
      } catch (IOException closeException) { 
       closeException.printStackTrace(); 
       System.out.println("Couldn't establish Bluetooth connection! (2)"); 
      } 

      try { 
       System.out.println("Try to connect again"); 
       mmSocket = (BluetoothSocket) mmDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class}).invoke(mmDevice, Integer.valueOf(1)); 
       mmSocket.connect(); 
      } catch (Exception connectException2) { 
       connectException.printStackTrace(); 
       try { 
        mmSocket.close(); 
        System.out.println("Couldn't establish Bluetooth connection! (3)"); 
       } catch (IOException closeException) { 
        closeException.printStackTrace(); 
        System.out.println("Couldn't establish Bluetooth connection! (4)"); 
       } 
      } 
     } 

     if(mmSocket.isConnected()) { 
      if(mmSocket.isConnected()) { 
       System.out.println("Connected"); 
    //Do something with the connected socket 

ich folgendes Protokoll erhalten, wenn die Lauf Methode aufrufen:

07-12 14:17:10.906 9941-10518/com.example.niekdewit.test I/System.out: Try to connect 
07-12 14:17:10.910 9941-10518/com.example.niekdewit.test W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback 
07-12 14:17:13.025 9941-10518/com.example.niekdewit.test W/System.err: java.io.IOException: read failed, socket might closed or timeout, read ret: -1 
07-12 14:17:13.025 9941-10518/com.example.niekdewit.test W/System.err:  at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:573) 
07-12 14:17:13.025 9941-10518/com.example.niekdewit.test W/System.err:  at android.bluetooth.BluetoothSocket.waitSocketSignal(BluetoothSocket.java:550) 
07-12 14:17:13.025 9941-10518/com.example.niekdewit.test W/System.err:  at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:325) 
07-12 14:17:13.025 9941-10518/com.example.niekdewit.test W/System.err:  at com.example.niekdewit.test.BluetoothConnectThread.run(BluetoothConnectThread.java:33) 
07-12 14:17:13.025 9941-10518/com.example.niekdewit.test I/System.out: Couldn't establish Bluetooth connection! (1) 
07-12 14:17:13.025 9941-10518/com.example.niekdewit.test I/System.out: Try to connect again 
07-12 14:17:13.025 9941-10518/com.example.niekdewit.test W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback 
07-12 14:17:13.147 9941-9941/com.example.niekdewit.test I/Timeline: Timeline: Activity_idle id: [email protected] time:762005544 
07-12 14:17:16.503 9941-9941/com.example.niekdewit.test I/Timeline: Timeline: Activity_idle id: [email protected] time:762008901 
07-12 14:17:17.279 9941-10518/com.example.niekdewit.test I/System.out: Connected 

ich die 2 Zeilen versucht

ersetzt
mmSocket = (BluetoothSocket) mmDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class}).invoke(mmDevice, Integer.valueOf(1)); 

mit

mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid); 

Aber das funktioniert auch nicht, es erzeugt jedoch ein anderes Protokoll. Mit dieser Methode kann ich mich auch beim zweiten Versuch nicht verbinden.

07-12 14:27:15.968 15135-15622/com.example.niekdewit.test I/System.out: Try to connect 
07-12 14:27:15.969 15135-15622/com.example.niekdewit.test W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback 
07-12 14:27:18.205 15135-15622/com.example.niekdewit.test W/System.err: java.io.IOException: read failed, socket might closed or timeout, read ret: -1 
07-12 14:27:18.205 15135-15622/com.example.niekdewit.test W/System.err:  at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:573) 
07-12 14:27:18.205 15135-15622/com.example.niekdewit.test W/System.err:  at android.bluetooth.BluetoothSocket.waitSocketSignal(BluetoothSocket.java:550) 
07-12 14:27:18.205 15135-15622/com.example.niekdewit.test W/System.err:  at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:325) 
07-12 14:27:18.205 15135-15622/com.example.niekdewit.test W/System.err:  at com.example.niekdewit.test.BluetoothConnectThread.run(BluetoothConnectThread.java:36) 
07-12 14:27:18.205 15135-15622/com.example.niekdewit.test I/System.out: Couldn't establish Bluetooth connection! (1) 
07-12 14:27:18.206 15135-15622/com.example.niekdewit.test I/System.out: Try to connect again 
07-12 14:27:18.206 15135-15622/com.example.niekdewit.test W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback 
07-12 14:27:18.319 15135-15135/com.example.niekdewit.test I/Timeline: Timeline: Activity_idle id: [email protected] time:762610717 
07-12 14:27:20.669 15135-15622/com.example.niekdewit.test W/System.err: java.io.IOException: read failed, socket might closed or timeout, read ret: -1 
07-12 14:27:20.669 15135-15622/com.example.niekdewit.test W/System.err:  at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:573) 
07-12 14:27:20.669 15135-15622/com.example.niekdewit.test W/System.err:  at android.bluetooth.BluetoothSocket.waitSocketSignal(BluetoothSocket.java:550) 
07-12 14:27:20.669 15135-15622/com.example.niekdewit.test W/System.err:  at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:325) 
07-12 14:27:20.669 15135-15622/com.example.niekdewit.test W/System.err:  at com.example.niekdewit.test.BluetoothConnectThread.run(BluetoothConnectThread.java:36) 
07-12 14:27:20.669 15135-15622/com.example.niekdewit.test I/System.out: Couldn't establish Bluetooth connection! (3) 
07-12 14:27:20.854 15135-15135/com.example.niekdewit.test I/Timeline: Timeline: Activity_idle id: [email protected] time:762613252 

Als ich mit dieser Linie versuchen, eine Verbindung

mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid); 

Und versuchen Sie auf dem zweiten Versuch („versuchen Sie es erneut zu verbinden“) mit dieser Linie

mmSocket = (BluetoothSocket) mmDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class}).invoke(mmDevice, Integer.valueOf(1)); 

Dann erzeugt sie das gleiche Protokoll wie das erste Protokoll, das ich anbrachte

Ich habe keine Ahnung, was vor sich geht? Ich hoffe, einer von euch kann sehen, was mit meinem Code nicht stimmt, oder mich in die richtige Richtung weisen.

EDIT: Wenn das Gerät bereits gepaart ist, dann ist es möglich, beim ersten Versuch mit beiden Methoden zu verbinden.

EDIT2:

mmSocket = mmDevice.createInsecureRfcommSocketToServiceRecord(uuid); 

auch nicht

funktioniert

Antwort

0

Ich würde versuchen,

mmSocket = (BluetoothSocket) mmDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class}).invoke(mmDevice, Integer.valueOf(1)); 

dieser

// BluetoothDevice device= BluetoothAdapter.getDefaultAdapter().getRemoteDevice("00:1C:4D:02:A6:55"); 
    // You already have a device so capture the method then invoke a socket 
    Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class }); 
    socket = (BluetoothSocket)m.invoke(device, Integer.valueOf(1)); 
    socket.connect(); 
    // Do some cool stuff 

zu ändern Dies ist, wie ich stets ein Anschluss an Geräte

+0

Danke für Ihre Antwort, aber das hat mein Problem nicht behoben. Das Ausgabe-Protokoll ist das gleiche wie mein erstes Protokoll, das ich an meinen Post angehängt habe :( – Niek

+0

Sie haben einen Bluetooth-Manager definiert, aber Sie verwenden ihn nicht. Ich könnte mir das ansehen, da Sie einen Fehler von 'W/bekommen. BluetoothAdapter: getBluetoothService() angerufen ohne BluetoothManagerCallback' –

+0

Bluetooth Manager ist eine Klasse, die ich selbst geschrieben habe, die als Schnittstelle für die Aktivität dient, um eine Bluetooth Verbindung usw. herzustellen gemacht worden: – Niek