私は現在、Bluetooth接続を必要とするAndroidアプリで発生した問題を修正しようとしています。一瞬、すべてが正常に機能しているように見えますが、接続したいスレーブBluetoothデバイスの電源がオンになっていないと、何か奇妙なことに気づきました。これが私のコードです:
private void connectDevice() {
mBluetoothAdapter.cancelDiscovery();
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
try {
btSocket = createBluetoothSocket(device);
} catch (IOException e) {
errorExit("Fatal Error", "Socket create failed: " + e.getMessage() + ".");
}
//Try to establish the connection. This will block until it connects.
Log.d(TAG, "...Connecting...");
try {
btSocket.connect();
Log.d(TAG, "....Connection ok...");
} catch (IOException e) {
try {
btSocket.close();
} catch (IOException e2) {
errorExit("Fatal Error", "Unable to close socket during connection failure" + e2.getMessage() + ".");
}
}
//Create a data stream so we can talk to server.
Log.d(TAG, "...Create Socket...");
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();
mActionBar.setSubtitle("Connected");
return;
}
そして、ここで私はこのメソッドを呼び出します:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case REQUEST_ENABLE_BT:
if (resultCode == RESULT_OK) {
Toast.makeText(this, R.string.bt_enabled, Toast.LENGTH_SHORT).show();
setupCom();
break;
}
else {
// User did not enable Bluetooth or an error occurred
if(D) Log.d(TAG, "BT not enabled");
Toast.makeText(this, R.string.bt_not_enabled_leaving, Toast.LENGTH_SHORT).show();
finish();
break;
}
case REQUEST_CONNECT_DEVICE:
if (resultCode == RESULT_OK){
retrieveAddresse(data);
connectDevice();
}
break;
}
return;
}
私の問題は、範囲内にいない場合、または接続したいデバイスの電源がオンになっていない場合、Android OSが必要としないために接続できない場合でも、connectDevice()メソッドがすべてのコードを実行しているように見えることです。接続プロセスによってブロックされます。mActionBar.setSubtitle( "Connected");が原因で、この問題に気づきました。範囲内にいるとき、またはスレーブBluetoothモジュールがオンになっているときに再接続しようとすると、実行されます。アプリケーションを再起動しないと接続できません。