简体   繁体   English

检测对 BluetoothAdapter 所做的状态更改?

[英]Detecting state changes made to the BluetoothAdapter?

I have an app with a button on it that I use to turn BT on and off.我有一个带有按钮的应用程序,用于打开和关闭 BT。 I have the following code in there;我在那里有以下代码;

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();
    }
}

I'm calling button Flip, which flips the BT state, and then calls ButtonText, which should update the UI.我正在调用按钮 Flip,它翻转 BT 状态,然后调用 ButtonText,它应该更新 UI。 However, the issue I'm having is, it takes a few seconds for BT to turn on - and during these seconds, the BT status is not enabled, making my button say Bluetooth off, even if it will be on in 2 seconds.但是,我遇到的问题是,BT 需要几秒钟才能打开 - 在这几秒钟内,BT 状态未启用,使我的按钮显示蓝牙关闭,即使它将在 2 秒内打开。

I found the STATE_CONNECTING constant in the BluetoothAdapter android documentation, but... I simply don't know how to use it, being a newbie and all.我在 BluetoothAdapter android 文档中找到了STATE_CONNECTING常量,但是......我根本不知道如何使用它,作为一个新手等等。

So, I've got two questions:所以,我有两个问题:

  1. Is there a way to dynamically tie a UI element (such as a button or image) to a BT state, so that when the BT state changes, the button will change as well?有没有办法动态绑定一个UI元素(比如按钮或者图片)到BT状态,这样当BT状态改变时,按钮也会随之改变?
  2. Otherwise, I would want to press the button and get the correct state (I would like for it to say BT on, even if it's only connecting, since it will be on in 2 seconds).否则,我想按下按钮并获得正确的状态(我希望它说 BT 打开,即使它只是连接,因为它将在 2 秒内打开)。 How do I do this?我该怎么做呢?

You will want to register a BroadcastReceiver to listen for any changes in the state of the BluetoothAdapter :您需要注册一个BroadcastReceiver来监听BluetoothAdapter状态的任何变化:

As a private instance variable in your Activity (or in a separate class file... whichever one you prefer):作为您的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;
            }
        }
    }
};

Note that this assumes that your Activity implements a method setButtonText(String text) that will change the Button 's text accordingly.请注意,这假设您的Activity实现了一个方法setButtonText(String text) ,该方法将相应地更改Button的文本。

And then in your Activity , register and unregister the BroadcastReceiver as follows,然后在您的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);
}
public void discoverBluetoothDevices(View view)
    {
        if (bluetoothAdapter!=null)

            bluetoothAdapter.startDiscovery();
            Toast.makeText(this,"Start Discovery"+bluetoothAdapter.startDiscovery(),Toast.LENGTH_SHORT).show();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM