如何搜索蓝牙设备?
How to search for Bluetooth devices?
我想构建一个扫描本地蓝牙设备的应用程序。该应用程序找到所有配对的设备,但没有未配对的设备。我有一个按钮,当我按下它时,我想在 Log
找到的设备中看到。
在 AndroidManifest
中,我添加了 BLUETOOTH
、BLUETOOTH_ADMIN
和 ACCESS_COARSE_LOCATION
的权限。
onCreate
我获得了默认的蓝牙适配器并获得了配对的设备。
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
处,我使用 ScanCallBack
.
执行 scanDevices
函数
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 开始,任何蓝牙扫描都需要满足以下两个条件:
- 位置权限(ACCESS_COARSE_LOCATION 目前足够但在 Android Q Beta apparently 中不够);
- 定位服务正在启用中。
所以这意味着在任何设备上 运行 Android 6 或更高版本,您必须使用运行时权限请求系统来请求用户授予您访问他的位置的权限。但这还不够,用户还必须开启他的定位服务(精度不是问题)。
您可以通过使用 Google Play 服务显示一个弹出窗口请求用户打开位置服务来实现这一点,或者您可以重定向到“设置”应用中的位置服务,用户可以在其中打开位置服务他的设备定位服务。
一旦满足这两个条件,当然,如果有设备在范围内,它们将开始显示在日志中。
注意:这也适用于使用经典蓝牙的简单蓝牙发现。
我想构建一个扫描本地蓝牙设备的应用程序。该应用程序找到所有配对的设备,但没有未配对的设备。我有一个按钮,当我按下它时,我想在 Log
找到的设备中看到。
在 AndroidManifest
中,我添加了 BLUETOOTH
、BLUETOOTH_ADMIN
和 ACCESS_COARSE_LOCATION
的权限。
onCreate
我获得了默认的蓝牙适配器并获得了配对的设备。
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
处,我使用 ScanCallBack
.
scanDevices
函数
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 开始,任何蓝牙扫描都需要满足以下两个条件:
- 位置权限(ACCESS_COARSE_LOCATION 目前足够但在 Android Q Beta apparently 中不够);
- 定位服务正在启用中。
所以这意味着在任何设备上 运行 Android 6 或更高版本,您必须使用运行时权限请求系统来请求用户授予您访问他的位置的权限。但这还不够,用户还必须开启他的定位服务(精度不是问题)。
您可以通过使用 Google Play 服务显示一个弹出窗口请求用户打开位置服务来实现这一点,或者您可以重定向到“设置”应用中的位置服务,用户可以在其中打开位置服务他的设备定位服务。
一旦满足这两个条件,当然,如果有设备在范围内,它们将开始显示在日志中。
注意:这也适用于使用经典蓝牙的简单蓝牙发现。