我想构建一个扫描本地蓝牙设备的应用程序。该应用会找到所有已配对的设备,但不会找到未配对的设备。我有一个按钮,当我按下按钮时,我想在Log
找到的设备中查看。
在AndroidManifest
中,我为BLUETOOTH
,BLUETOOTH_ADMIN
和ACCESS_COARSE_LOCATION
添加了权限。
onCreate
我得到了默认的BluetoothAdapter并得到了配对的设备。
protected void onCreate(Bundle savedInstanceState) {
....
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(!bluetoothAdapter.isEnabled()) {
Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enable, REQUEST_ENABLE_BT);
}
pairedDevices = bluetoothAdapter.getBondedDevices();
///Add paired Devices
for(BluetoothDevice device : pairedDevices){
Log.i("DEVICE", device.getAddress()+" "+device.getName());
devicesList.add(device);
}
}
在onClick
,我使用scanDevices
来执行ScanCallBack
函数。
final ScanCallback scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
if(!devicesList.contains(result.getDevice())) {
Log.i("DEVICE", result.getDevice().getName()+ " "+result.getDevice().getAddress());
devicesList.add(result.getDevice());
}
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
}
};
bluetoothAdapter.getBluetoothLeScanner().startScan(scanCallback);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
bluetoothAdapter.getBluetoothLeScanner().stopScan(scanCallback);
}
}, 10000);
}
当我启动该应用程序时,它什么都不做,没有任何设备打印在日志中,而当我尝试对其进行调试时,它甚至没有在ScanCallBack中停止。
答案 0 :(得分:1)
从Android 6.0 /棉花糖开始,任何蓝牙扫描都需要满足以下两个条件:
因此,这意味着在任何运行Android 6或更低版本的设备上,您必须使用运行时权限请求系统来要求用户授予您对其位置的访问权限。但这还不够,用户还必须打开其位置服务(精度不是问题)。
您可以通过使用Google Play服务显示要求用户打开位置服务的弹出窗口来实现此目的,或者您可以在“设置”应用中重定向到位置服务,在此用户可以打开其设备位置服务。 / p>
同时满足两个条件后,如果有任何设备在范围内,设备将开始显示在日志中。
注意:这对于使用Bluetooth Classic的简单Bluetooth Discovery也有效。