Bluetooth создает сокет, но блокирует при подключении () ANDROID - PullRequest
2 голосов
/ 12 октября 2010

Я использую код из примера Google Bluetooth Chat для настройки сервера прослушивания Bluetooth.Я хочу, чтобы приложение всегда слушало входящее соединение.Когда приложение увидит запрос на подключение, оно примет подключение, прочитает строку, которую отправит удаленное устройство, а затем ответит, отправив файл.

Проблема заключается в том, что приложение никогда не принимает подключение.Он блокируется на socket = mmServerSocket.accept(); и никогда не движется дальше.См. Код ниже после строки if(D) System.out.println("Waiting to connect************");. Чтобы проверить это, я запускаю операцию, которая запускает поток, а затем пытаюсь подключиться к ноутбуку и отправить файл.Когда я делаю это, общий Android-менеджер Bluetooth видит файл и загружает его, фактически минуя мое Android-устройство.Это единственный способ проверить это?Я не могу понять, если это проблема тестирования или кодирования.

private class AcceptThread extends Thread {
    // The local server socket
    private final BluetoothServerSocket mmServerSocket;

    public AcceptThread() {
        BluetoothServerSocket tmp = null;

        // Create a new listening server socket
        try {
            tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
        } catch (IOException e) {
            Log.e(TAG, "listen() failed", e);
        }
        mmServerSocket = tmp;
    }

    public void run() {
        if (D) Log.d(TAG, "BEGIN mAcceptThread" + this);
        setName("AcceptThread");
        BluetoothSocket socket = null;

        // Listen to the server socket if we're not connected
        while (mState != STATE_CONNECTED) {
            try {
                // This is a blocking call and will only return on a
                // successful connection or an exception
                if(D) System.out.println("Waiting to connect************");
                socket = mmServerSocket.accept();
                if(D) System.out.println("We have accepted connection and are connected***************");
            } catch (IOException e) {
                Log.e(TAG, "accept() failed", e);
                break;
            }

            // If a connection was accepted
            if (socket != null) {
                synchronized (BluetoothServer.this) {
                    switch (mState) {
                    case STATE_LISTEN:
                    case STATE_CONNECTING:
                        // Situation normal. Start the connected thread.
                        connected(socket, socket.getRemoteDevice());
                        break;
                    case STATE_NONE:
                    case STATE_CONNECTED:
                        // Either not ready or already connected. Terminate new socket.
                        try {
                            socket.close();
                        } catch (IOException e) {
                            Log.e(TAG, "Could not close unwanted socket", e);
                        }
                        break;
                    }
                }
            }
        }
        if (D) Log.i(TAG, "END mAcceptThread");
    }

Ответы [ 3 ]

2 голосов
/ 30 ноября 2010

Решение этой проблемы находится в вашем файле androidmanifest.xml;

uses-permission android:name="android.permission.BLUETOOTH_ADMIN" 
uses-permission android:name="android.permission.BLUETOOTH"

Телефон не дает вашей программе разрешения

Я на самом деле добавил код, но, думаю, его отредактировали

1 голос
/ 28 января 2011

У меня такая же проблема.Я использую пример чата Bluetooth, который считывает данные с Arduino BT, который выводит данные АЦП.Все работало нормально, пока я не обновил свой SDK.Программа не завершается, пока я не попытаюсь прочитать данные с помощью InpuStream, обернутого в DataInputStream, чтобы я мог использовать функцию readline ().У меня есть правильный UUID.Я пытался несколько раз

моя измененная функция чтения:

public void run() {
        Log.i(TAG, "BEGIN mConnectedThread");
        mmDataInStream = new DataInputStream(mmInStream);

        // Keep listening to the InputStream while connected
        while (true) {
            try {
                // Read from the DataInputStream
                String mess = mmDataInStream.readLine();
                int mes = Integer.parseInt(mess);
                mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, mes)
                        .sendToTarget();

            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                connectionLost();
                break;
            }
        }
    }
1 голос
/ 17 октября 2010

Проверьте, ищет ли ваша клиентская сторона тот же UUID, что и MY_UUID. Возможно, вы захотите изменить UUID на общий UUID для RFCOMM.

private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...