BluetoothServerSocketのaccept()コールで受信スレッドを受信しました。このスレッドは、別のスレッドによってかなり頻繁に強制終了され、再起動されます。 killシグナルを受け取ると、BluetoothServerSocketが閉じられ、accept()でIOExceptionが発生し、無限ループから抜け出します。しかし、これらの起動と再起動中に、listenUsingRfcommWithServiceRecord()コールが「不良ファイル番号」IOExceptionをキャッチし、ループを途中で終了することがあります。私はkillコンポーネント(?)でBTコンポーネントを正しくシャットダウンしていないかもしれないと思うが、まだ何かを理解していない...誰かに私にいくつかのポインタを教えてもらえますか?Android Bluetooth IOException不正なファイル番号
private class ReceiveThread extends Thread {
private final static String TAG = "ReceiveThread";
private BluetoothServerSocket mmBtServer;
private BluetoothSocket mmBtSocket;
public ReceiveThread() {
setName(TAG);
}
public void run() {
if(D) Log.d(TAG,"RceiveThread running");
while(true) {
try {
SetState(SERVICE_STATE.LISTENING);
mmBtServer = mBtAdapter.listenUsingRfcommWithServiceRecord(mAppName, mUUID);
if(D) Log.d(TAG,"ReceiveThd accepting connection");
mmBtSocket = mmBtServer.accept();
// Close server once socket establishes
mmBtServer.close();
if(D) Log.d(TAG, "Connection Established");
SetState(SERVICE_STATE.CONNECTED_BUSY);
/** Handle Processing **/
// Close socket
mmBtSocket.close();
} catch (IOException e) {
SetState(SERVICE_STATE.NOT_CONNECTED);
Log.d(TAG,"IOException in ReceiveThread", e);
break;
}
SetState(SERVICE_STATE.CONNECTED_IDLE);
}
}
public void kill() {
try {
if(mmBtSocket!=null) mmBtSocket.close();
if(mmBtServer!=null) mmBtServer.close();
} catch (IOException e) {
Log.d(TAG,"Failure killing ReceiveThread", e);
}
SetState(SERVICE_STATE.NOT_CONNECTED);
}
}
Samsung Galaxy Sと同じ問題です。他のデバイスでは再生できません。どういう意味ですか? – Saasha
うれしいことに再現できます。 Prollyは、サムスンがbtを統合して非常に良い仕事をしなかったことを意味します。 – broody
私は2.3.3のGalaxy Tab GT-P1000(オリジナル)で同じ現象を見ました。私のアプリケーションは、リモートデバイスへの接続を行うbluetoothsocket接続を行いますが、接続コールは返されず、最終的にはプロセスを終了する必要があります。私の次の走りで、あなたが観察した問題が発生します。だから、問題の根は接続(私にとって)です。 – Tom