Java 经过长时间等待后,蓝牙插座状态出现混乱

Java 经过长时间等待后,蓝牙插座状态出现混乱,java,android,sockets,bluetooth,Java,Android,Sockets,Bluetooth,我目前正在尝试修复我的Android应用程序遇到的一个问题,该应用程序需要蓝牙连接。有一段时间,一切似乎都正常,但我注意到,当我想要连接的从属蓝牙设备未通电时,出现了一些奇怪的情况。这是我的密码: private void connectDevice() { mBluetoothAdapter.cancelDiscovery(); BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); tr

我目前正在尝试修复我的Android应用程序遇到的一个问题,该应用程序需要蓝牙连接。有一段时间,一切似乎都正常,但我注意到,当我想要连接的从属蓝牙设备未通电时,出现了一些奇怪的情况。这是我的密码:

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;
}
我的问题是,当我不在范围内或者我想连接的设备没有通电时,connectDevice()方法似乎会执行所有代码,即使无法连接,因为Android操作系统不想被连接过程阻塞。我注意到这个问题是因为mActionBar.setSubtitle(“Connected”);执行,因为当我在范围内或从蓝牙模块打开时尝试重新连接。除非重新启动应用程序,否则无法连接到它

把这些行放在下面:

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

在第一次尝试中。这样,只有当设备建立连接时,才会执行这些操作。因为实际上它们在try/catch之外,所以即使没有连接,它们也将始终执行。

如何获取设备地址?使用bluetooth discovery?地址由DeviceListActivity类检索,该类为我提供列表中的所有设备。我选择一个设备并提取此部分工作的地址。对,关于线程,您是正确的。但是,如果我无法连接,为什么我会获得连接状态?您的代码可以在btSocket.connect()上被阻止,但与您的设备可以连接或不能连接无关,在该行之后,您的代码将不再被阻止。也许您的connectedThread可以阻塞,但它运行在主线程之外。当您尝试连接超出范围的设备时,是否会出现错误?是的,正如我的问题解释中所述,一切正常,但当设备超出范围时,我有问题。如果发生这种情况,我必须重新启动应用程序,否则我将无法连接。应用程序的连接状态似乎很模糊,即使蓝牙设备现在在范围内,我也无法断开或连接。