学校でのプロジェクト用に小さな Bluetooth-Android-App を構築しようとしています。
私はAndroidにかなり慣れていません(2日から携帯電話を手に入れました)。私はラップトップでAndroidプログラミングを2週間試しています。ラップトップを使用できるように、Android x86 (eeepc) を搭載した VirtualBox をインストールしましたBluetoothAdapter
。エミュレータは Bluetooth をサポートしておらず、かなり遅いです。それはプロジェクトについてです...
問題/質問: Bluetooth 接続には 2 つのデバイス (接続側とリッスン側) があります。リスニング デバイスには、が返されるまでメソッドBluetoothServerSocket
をループする があります。私の場合、メソッドが返されないため、行き詰まり、アプリがフリーズして黒い画面が表示され、mit にアプリを停止するか、待つように求められます。-->にタイムアウトを渡すと、タイムアウト後にエラーが発生します。accept()
accept()
BluetoothSocket
accept()
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 つのデバイスでアプリをテストしたことを書き忘れていました。電話を使用して接続しようとしている間、ラップトップは受け入れループを行います。