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

我有一个应用程序的button,我用来打开和closuresBT。 我在那里有下面的代码;

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

我打电话buttonFlip,翻转BT状态,然后调用ButtonText,它应该更新UI。 然而,我遇到的问题是,BT开启需要几秒钟 – 在这段时间内,BT状态未启用,使我的button说蓝牙closures,即使它将在2秒钟内打开。

我在BluetoothAdapter android文档中find了STATE_CONNECTING常量,但是…我根本不知道如何使用它,作为一个新手和所有。

所以,我有两个问题:

  1. 有没有办法将UI元素(如button或图像)dynamic绑定到BT状态,以便当BT状态改变时,button也会改变?
  2. 否则,我想要按下button,并获得正确的状态(我想它说BT,即使它只是连接,因为它将在2秒钟)。 我如何做到这一点?

您将需要注册BroadcastReceiver以侦听BluetoothAdapter状态的任何更改:

作为你的Activity一个私有实例variables(或者在一个单独的类文件中,无论你喜欢哪一个):

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