3

学校でのプロジェクト用に小さな Bluetooth-Android-App を構築しようとしています。

私はAndroidにかなり慣れていません(2日から携帯電話を手に入れました)。私はラップトップでAndroidプログラミングを2週間試しています。ラップトップを使用できるように、Android x86 (eeepc) を搭載した VirtualBox をインストールしましたBluetoothAdapter。エミュレータは Bluetooth をサポートしておらず、かなり遅いです。それはプロジェクトについてです...

問題/質問: Bluetooth 接続には 2 つのデバイス (接続側とリッスン側) があります。リスニング デバイスには、が返されるまでメソッドBluetoothServerSocketをループする があります。私の場合、メソッドが返されないため、行き詰まり、アプリがフリーズして黒い画面が表示され、mit にアプリを停止するか、待つように求められます。-->にタイムアウトを渡すと、タイムアウト後にエラーが発生します。accept()accept()BluetoothSocketaccept()accept()accept(10000)IOException

リスニング デバイス:

private class AcceptThread extends Thread {

    private BluetoothSocket tSocket;
    private BluetoothServerSocket bss = null;

    public void run() {
        try {
            Log.d(TAG, "erzeuge ServerSocket");
            bss = BluetoothAdapter.getDefaultAdapter().listenUsingInsecureRfcommWithServiceRecord("BluetoothChatInsecure", MainActivity.BT_UUID);
            Log.d(TAG, "ServerSocket OK");
        } catch (IOException e) {
            e.printStackTrace();
            Log.e(TAG, "Fehler Serversocket");
        }

        while (true)  {

            Log.d(TAG, "Versuche zu akzeptieren");
            try {
                Log.d(TAG, "Akzeptieren Anfang");
                tSocket = bss.accept(10000);
                //this line is never reached
                Log.d(TAG, "Akzeptieren Ende");

                if (tSocket != null){
                    //Hier wollen wir hin!
                    Log.d(TAG, "Verbindung akzeptiert");
                    ConnectedThread conThread = new ConnectedThread(tSocket);
                    conThread.run();
                    bss.close();
                    break;
                } else {
                    Log.e(TAG, "Fehler, keine Verbindung");
                }
            } catch (IOException e) {
                Log.e(TAG, "IOException währent accept-loop");
                //this exception is triggered every 10 sec, when the accept(10000) times out
                e.printStackTrace();
            }   
        }
        Log.i(TAG, "Acceptthread hat fertig");          
    }

}

接続デバイス:

try {
    socket = device.createInsecureRfcommSocketToServiceRecord(MainActivity.BT_UUID);

    outstr = socket.getOutputStream();
    instr = socket.getInputStream();

    ois = new ObjectInputStream(instr);
    oos = new ObjectOutputStream(outstr);

} catch (IOException e) {
    e.printStackTrace();
}

このトピックに関するstackoverflowや他のフォーラムで多くのスレッドを読みましたが、問題の解決策はありませんでした. 私の英語で申し訳ありませんが、私はネイティブ スピーカーではありません。

助けてくれてありがとう!

編集:

2 つのデバイスでアプリをテストしたことを書き忘れていました。電話を使用して接続しようとしている間、ラップトップは受け入れループを行います。

4

4 に答える 4

0

今日、私はプロジェクトの作業を続けました。接続デバイスから connect() に失敗した後、IOException を受け取りました。アプリを実行する前にデバイスをペアリングした後、ソケットを持つようにデバイスを管理しました。

EDIT:accept()はソケットを返すようになりましたが、isConnected()で尋ねると接続されません。接続機器のソケットが接続されています。

于 2013-04-01T13:09:10.380 に答える
0

私はこの問題に数日間直面しています。
最後に、その理由がわかりました。サーバーで着信接続を 2 回受け入れるスレッドを作成していたのです。したがって、accept() メソッドが呼び出されたのは 2 回目だけでしたが、ServerSocket は何度も作成されていました。
これにより、サーバーが接続を受け入れなくなります!!

于 2014-08-01T07:40:51.157 に答える