当前位置: 首页 > 面试题库 >

是否检测到BluetoothAdapter的状态更改?

吕俊美
2023-03-14
问题内容

我有一个带有按钮的应用程序,用于打开和关闭BT。我那里有以下代码;

public void buttonFlip(View view) {
    flipBT();
    buttonText(view);
}

public void buttonText(View view) {  
    Button buttonText = (Button) findViewById(R.id.button1);
    if (mBluetoothAdapter.isEnabled() || (mBluetoothAdapter.a)) {
        buttonText.setText(R.string.bluetooth_on);  
    } else {
        buttonText.setText(R.string.bluetooth_off);
    }
}

private void flipBT() {
    if (mBluetoothAdapter.isEnabled()) {
        mBluetoothAdapter.disable();    
    } else {
        mBluetoothAdapter.enable();
    }
}

我正在调用按钮Flip(翻转BT状态),然后调用ButtonText,后者应该更新UI。但是,我遇到的问题是,打开BT需要花费几秒钟的时间-
在这几秒钟中,BT状态未启用,即使我的按钮在2秒钟内打开,我的按钮也会关闭蓝牙。

STATE_CONNECTING在BluetoothAdapter
android文档中找到了该常量,但是…我只是不知道如何使用它,无论是新手还是所有人。

因此,我有两个问题:

  1. 有没有一种方法可以将UI元素(例如按钮或图像)动态绑定到BT状态,以便当BT状态更改时,按钮也将更改?
  2. 否则,我想按下按钮并获得正确的状态(我希望它说BT处于打开状态,即使它只是在连接,因为它会在2秒钟内打开)。我该怎么做呢?

问题答案:

您将需要注册一个BroadcastReceiver来监听状态的任何变化BluetoothAdapter

作为您的私有实例变量Activity(或在单独的类文件中,…首选):

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();

        if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
            final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
                                                 BluetoothAdapter.ERROR);
            switch (state) {
            case BluetoothAdapter.STATE_OFF:
                setButtonText("Bluetooth off");
                break;
            case BluetoothAdapter.STATE_TURNING_OFF:
                setButtonText("Turning Bluetooth off...");
                break;
            case BluetoothAdapter.STATE_ON:
                setButtonText("Bluetooth on");
                break;
            case BluetoothAdapter.STATE_TURNING_ON:
                setButtonText("Turning Bluetooth on...");
                break;
            }
        }
    }
};

请注意,这是假设您Activity实现的方法setButtonText(String text)将相应地更改Button的文本。

然后在您的中Activity,注册并注销BroadcastReceiver以下内容,

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /* ... */

    // Register for broadcasts on BluetoothAdapter state change
    IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
    registerReceiver(mReceiver, filter);
}

@Override
public void onDestroy() {
    super.onDestroy();

    /* ... */

    // Unregister broadcast listeners
    unregisterReceiver(mReceiver);
}


 类似资料:
  • 问题内容: 当用鼠标单击时,如何检测JRadioButton从“未选中”更改为“选中”?我曾尝试在按钮上使用ActionListener,但是每次单击单选按钮时都会触发该事件,而不仅仅是在将状态更改为“选定”时触发。 我曾想过要维护一个记住按钮状态的布尔变量,并在ActionListener中对其进行测试以查看是否更改其状态,但是我想知道是否有更好或更干净的解决方案。 问题答案: 看一下JRadi

  • 问题内容: 我知道React可以异步并批量执行状态更新以优化性能。因此,在调用之后,您将永远无法相信要更新的状态。但是你可以信任的反应 更新相同的顺序状态被称为对 相同的组件? 不同的组件? 考虑在以下示例中单击按钮: 1. 在以下情况下,是否有可能 a为假而b为真 : 2. 在以下情况下,是否有可能 a为假而b为真 : 请记住,这些是我用例的极端简化。我意识到我可以以不同的方式进行操作,例如,在

  • 我知道React可能会异步和批量地执行状态更新,以进行性能优化。因此,在调用之后,您永远不能相信会更新状态。但是,您是否信任React按照调用时的顺序更新状态 相同的组件? 不同的组件? 任何有文档支持的答案都是非常感谢的。

  • Hibernate 的用户曾要求一个既可自动分配新持久化标识(identifier)保存瞬时(transient)对象,又可更新/重新关联脱管(detached)实例的通用方法。saveOrUpdate() 方法实现了这个功能。 // in the first session Cat cat = (Cat) firstSession.load(Cat.class, catID); // in a

  • 问题内容: 我想知道何时失去互联网连接并重新获得互联网,以便可以在显示“糟糕,没有互联网”的警报和包含从我的服务器派生的数据的Google地图或网格之间切换。 这个相关的问题和另一个相关的问题认为他们有答案,但没有答案。 他们的解决方案适用于Chrome版本34.0.1847.137 m,MS IE v11.0.xx,但不适用于FireFox v29.0.1,因此,我正在寻求一种适用于所有这三种浏

  • 我阅读了一些关于“发送数据”状态的解释,但我仍然不知道查询是否正在运行。他们说“发送数据”是指服务器向客户端发送一些数据,但我真的不知道发送的是哪一个数据。 当MySQL处于“发送数据”状态时意味着什么?