设置蓝牙监听服务器套接字时出错

时间:2016-11-19 22:08:38

标签: android multithreading bluetooth connectivity

我正在尝试设置一个侦听传入连接的BluetoothServerSocket。从日志和使用应用程序,我可以看到它启用蓝牙,如果它被禁用。它还能够创建ServerSocket。它没有更进一步,我没有获得run()方法的任何日志消息。

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:结果没有调用线程的方法run(),因为......没有人调用它! 现在进入accept()调用。但是有一点我得到 MainActivity没有响应。你想关闭吗? 我知道accept()是一个阻塞调用,它在接受连接或有一些错误时返回。我不明白为什么它说MainActivity没有响应。这个accept()调用是在一个不同的线程上,那么这是一个什么问题呢?

1 个答案:

答案 0 :(得分:0)

你不应该这样做:

new AcceptThread().run();

但是这个:

(new AcceptThread()).start();

如果你执行

new AcceptThread().run();

你只是创建一个新的Thread 对象但没有新的(android)线程;代码仍然在同一个(UI)线程上执行...