我想构建一个扫描本地蓝牙设备的应用程序。该应用找到所有配对设备,但没有未配对的设备。我有一个按钮,当我按下它时,我想在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中。
从Android 6.0 / Marshmallow开始,任何蓝牙扫描都需要以下两个条件:
因此,这意味着在运行Android 6或更高版本的任何设备上,您必须使用运行时权限请求系统来要求用户授予您访问其位置的权限。但这还不够,用户还必须打开他的位置服务(精度不是问题)。
您可以通过使用Google Play服务显示请求用户打开位置服务的弹出窗口,或者您可以在设置应用中重定向到位置服务,用户可以在其设备位置服务上切换。
一旦满足这两个条件,当然,如果任何条件在范围内,设备将开始显示在日志中。
注意:这对使用Bluetooth Classic的简单蓝牙发现也有效。