Java 检测对 BluetoothAdapter 所做的状态更改?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9693755/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Detecting state changes made to the BluetoothAdapter?
提问by raingod
I have an app with a button on it that I use to turn BT on and off. I have the following code in there;
我有一个带有按钮的应用程序,用于打开和关闭 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();
}
}
I'm calling button Flip, which flips the BT state, and then calls ButtonText, which should update the 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.
我正在调用按钮 Flip,它翻转 BT 状态,然后调用 ButtonText,它应该更新 UI。但是,我遇到的问题是,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.
我STATE_CONNECTING
在 BluetoothAdapter android 文档中找到了常量,但是...作为新手,我根本不知道如何使用它。
So, I've got two questions:
所以,我有两个问题:
- 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?
- 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). How do I do this?
- 有没有办法动态绑定一个UI元素(比如按钮或图片)到BT状态,这样当BT状态改变时,按钮也会随之改变?
- 否则,我想按下按钮并获得正确的状态(我希望它说 BT 打开,即使它只是连接,因为它将在 2 秒内打开)。我该怎么做呢?
采纳答案by Alex Lockwood
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);
}
回答by ranjith chowdary
public void discoverBluetoothDevices(View view)
{
if (bluetoothAdapter!=null)
bluetoothAdapter.startDiscovery();
Toast.makeText(this,"Start Discovery"+bluetoothAdapter.startDiscovery(),Toast.LENGTH_SHORT).show();
}