我正在研究一个可搜索设备并将其显示为按钮的应用程序。
调用startDiscovery()
时,根据我当前使用BroadcastReceiver
和ACTION_DISCOVERY_FINISHED
调试它的方式,我会说它工作30%的时间。
我还使用isDiscovering()
测试是否调用了startDiscovery()
函数,但它返回false。
有没有办法知道startDiscovery()
是否成功调用?您能在我的代码中识别出不会失败的东西吗?
观察:我同时具有BLUETOOTH
和BLUETOOTH_ADMIN
权限。
这是我的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String Address;
// When discovery finds a device
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Address = device.getAddress();
System.out.println("Found Address: " + Address ); //DEBUG
//Do something with Address
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
System.out.println("Discovery finished");
}
}
};
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiver, filter);
MainActivity.mBluetoothAdapter.startDiscovery();
if (MainActivity.mBluetoothAdapter.isDiscovering()) {
System.out.println("Discovering..."); //DEBUG
}
}
尽管我有一些可发现的设备,但没有一个可以用
onReceive()
触发ACTION_FOUND
更新:运行该应用程序时,我转到了“蓝牙设置”下的“扫描”,并且无法扫描新设备。我禁用/启用了蓝牙并返回到应用程序,问题已解决。我不知道这是否表明适配器正忙或暂停。
最佳答案
我确认这个问题。
在某些电话上,您只需要禁用/激活BT。您可以通过编程方式进行操作
mBluetoothAdapter.disable();
mBluetoothAdapter.enable();
在某些电话上,这还不够(三星S5)。为了检测它,我使用了计时器,如果在超时结束时未收到BT广播状态的更改(BluetoothAdapter.ACTION_DISCOVERY_STARTED或BluetoothAdapter.ACTION_DISCOVERY_FINISHED)=>它表示BT无法正常工作。实际上,我显示了一个对话框,建议用户重新启动电话。