2016-11-19 4 views
0

Ich versuche, eine BluetoothServerSocket einzurichten, die eingehende Verbindungen überwacht. Aus den Logs und aus der App kann ich sehen, dass es Bluetooth aktiviert, wenn es deaktiviert ist. Es ist auch möglich, einen ServerSocket zu erstellen. Es geht nicht weiter, ich bekomme keine Log-Nachrichten für die Methode run().Fehler beim Einrichten des Bluetooth-Abhörserver-Sockets

11-19 21:50:20.237 5187 5187 E bluetoothd: Invalid rfcomm listen params 
11-19 21:50:20.237 5127 5127 E BluetoothServiceJni: Socket listen failed: 7 
11-19 21:50:20.237 5127 5127 E BluetoothAdapterService: Failed to create socket channel 
11-19 21:50:20.237 5127 5127 E ObexServerSockets: Error create ServerSockets 
11-19 21:50:20.237 5127 5127 E ObexServerSockets: java.io.IOException: Error: -1 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at android.bluetooth.BluetoothAdapter.listenUsingRfcommOn(BluetoothAdapter.java:1542) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at android.bluetooth.BluetoothAdapter.listenUsingRfcommOn(BluetoothAdapter.java:1508) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at com.android.bluetooth.ObexServerSockets.create(ObexServerSockets.java:118) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at com.android.bluetooth.ObexServerSockets.create(ObexServerSockets.java:84) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at com.android.bluetooth.map.BluetoothMapMasInstance.startRfcommSocketListener(BluetoothMapMasInstance.java:273) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at com.android.bluetooth.map.BluetoothMapService.startRfcommSocketListeners(BluetoothMapService.java:200) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at com.android.bluetooth.map.BluetoothMapService.-wrap10(BluetoothMapService.java) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at com.android.bluetooth.map.BluetoothMapService$1.handleMessage(BluetoothMapService.java:327) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at android.os.Handler.dispatchMessage(Handler.java:102) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at android.os.Looper.loop(Looper.java:148) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at android.app.ActivityThread.main(ActivityThread.java:5415) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at java.lang.reflect.Method.invoke(Native Method) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:744) 
11-19 21:50:20.237 5127 5127 E ObexServerSockets:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634) 
11-19 21:50:20.538 5127 5127 E ObexServerSockets: Error to create listening socket after 10 try 
11-19 21:50:20.538 5127 5127 E BluetoothMapMasInstance0: Failed to start the listeners 

MainActivity.java:

package com.example.android; 

import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothServerSocket; 
import android.bluetooth.BluetoothSocket; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 

import java.io.IOException; 
import java.util.UUID; 

public class MainActivity extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     new AcceptThread()**.run()**; // not enough to create new thread, its method run() also needs to be called! 
    } 

    private class AcceptThread extends Thread { 
     private final String LOG_TAG = getClass().getSimpleName(); 
     private final BluetoothAdapter oBTAdapter = null; 
     private final BluetoothServerSocket oBTServerSocket; 
     private final UUID MY_UUID = UUID.fromString("4efaedef-7424-4bf6-bd70-673a7bff43fe"); 

     private int REQUEST_ENABLE_BT = 1; 

     public AcceptThread() { 
      BluetoothAdapter oBTAdapter = BluetoothAdapter.getDefaultAdapter(); 
      BluetoothServerSocket tmp = null; 

      if (!oBTAdapter.isEnabled()) { 
       Log.i(LOG_TAG, "bluetooth not enabled"); 
       Intent iEnableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
       startActivityForResult(iEnableBT, REQUEST_ENABLE_BT); 
      } 
      // Do not go further if bluetooth is not enabled 
      while (!oBTAdapter.isEnabled()) Log.i(LOG_TAG, "waiting for bluetooth to be enabled"); 
      try { 
       tmp = oBTAdapter.listenUsingRfcommWithServiceRecord("BTServer", MY_UUID); 
       Log.i(LOG_TAG, "created ServerSocket"); 
      } catch (IOException e) { 
       Log.i(LOG_TAG, "couldn't acquire ServerSocket"); 
       Log.i(LOG_TAG, e.getMessage()); 
      } 
      oBTServerSocket = tmp; 
     } 

     public void run() { 
      Log.i(LOG_TAG, "run()"); 
      BluetoothSocket oBTSocket = null; 
      while (true) { 
       try { 
        oBTSocket = oBTServerSocket.accept(); 
        Log.i(LOG_TAG, "accept()"); 
       } catch (IOException e) { 
        Log.i(LOG_TAG, "failure on accept()"); 
        Log.i(LOG_TAG, e.getMessage()); 
        break; 
       } 

       if (oBTSocket != null) { 
        Log.i(LOG_TAG, "a connection was accepted"); 
        //manageConnectedThread(oBTSocket); 
        try { 
         oBTServerSocket.close(); 
        } catch (IOException e) { 
         Log.i(LOG_TAG, "failure while closing ServerSocket"); 
         Log.i(LOG_TAG, e.getMessage()); 
        } 
        break; 
       } 
      } 
     } 

     public void cancel() { 
      try { 
       oBTServerSocket.close(); 
      } catch (IOException e) { 
       Log.i(LOG_TAG, e.getMessage()); 
      } 
     } 

     public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
      if (requestCode == REQUEST_ENABLE_BT) { 
       if (resultCode == RESULT_OK) { 
        Log.i(LOG_TAG, "bluetooth enabled with success"); 
       } else { 
        Log.i(LOG_TAG, "failed to enable bluetooth"); 
       } 
      } 
     } 
    } 
} 

Edit1: Es stellte sich heraus Methode run() des Threads aufgerufen wurde, nicht weil ... niemand rief! Jetzt geht es in accept() Anruf. Aber nach ein bisschen bekomme ich MainActivity reagiert nicht. Willst du es schließen? Ich verstehe accept() ist ein blockierender Aufruf und es wird zurückgegeben, wenn eine Verbindung akzeptiert wird oder ein Fehler vorliegt. Ich verstehe nicht, warum es sagt MainActivity reagiert nicht. Dieser accept() Aufruf ist auf einem anderen Thread, also wie ist das ein Problem?

Antwort

0

Sie sollten dies nicht tun:

new AcceptThread().run(); 

aber:

(new AcceptThread()).start(); 

, wenn Sie ausführen

new AcceptThread().run(); 

Sie erstellen gerade einen neuen Thread Objekt aber keine neuen (Android-) Thread; Der Code wird weiterhin auf demselben (UI) -Thread ausgeführt.

Verwandte Themen