0

私は現在、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モジュールがオンになっているときに再接続しようとすると、実行されます。アプリケーションを再起動しないと接続できません。

4

1 に答える 1

0

これらの行を入れてください:

mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();
mActionBar.setSubtitle("Connecté");

最初の試みの中で。このように、デバイスが接続を確立した場合にのみ実行されます。実際にはtry/catchの外部にあるため、接続がなくても常に実行されます。

于 2013-03-05T03:19:24.373 に答える