2016-11-19 10 views
0

着信接続を待機するBluetoothServerSocketを設定しようとしています。ログからと私はそれが無効になっている場合は、Bluetoothを有効にすることがわかりますアプリを使用してから。また、ServerSocketを作成することもできます。それ以上のことはしません、私はrun()メソッドのログメッセージを取得しません。Bluetoothリスニングサーバソケットの設定エラー

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:は...誰もそれを呼び出していなかったので、呼び出されなかったメソッドの実行を()スレッドの判明します! これでaccept()コールが開始されました。しかし、少し後に私はMainActivityが応答していません。あなたはそれを閉じたいですか? accept()はブロッキングコールであり、接続が受け入れられたときや何らかのエラーが発生したときに返されることを理解しています。私はMainActivityが応答していないと言う理由を理解していません。このaccept()呼び出しは別のスレッド上にあるので、どのように問題になりますか?

答えて

0

あなたがこれを行うべきではありません:あなたは

new AcceptThread().run(); 

を実行する場合は、単に新しいスレッドオブジェクトが、新たに作成

(new AcceptThread()).start(); 

new AcceptThread().run(); 

が、これを(アンドロイド)スレッド。コードは同じ(UI)スレッドでまだ実行されています...

関連する問題