BluetoothLescan() 没有找到任何设备
BluetoothLescan() not finding any devices
我在使用 Samsung Galaxy s5 进行蓝牙扫描设备时遇到了一些问题。
我使用的是 Android 6.0 并已为我的应用程序设置权限,以便像这样进行扫描:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
// Android M Permission check
if (this.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("This app needs location access");
builder.setMessage("Please grant location access so this app can devices.");
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
public void onDismiss(DialogInterface dialog) {
requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
}
});
builder.show();
}
我认为这是正常工作的,因为我收到弹出窗口询问我接受的权限。
我的扫描功能:
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
Log.i("start" , "Stopping scan...");
mBluetoothLeScanner.stopScan(mScanCallback);
}
}, SCAN_PERIOD);
mScanning = true;
Log.i("start" , "Starting scan...");
mBluetoothLeScanner.startScan(mScanCallback);
} else {
mScanning = false;
mBluetoothLeScanner.stopScan(mScanCallback);
}
}
现在它停止并正确开始扫描,因为 Logcat 正在给我日志。但它只是没有找到任何设备,这真的很奇怪,因为我坐在我的笔记本电脑旁边,第二个 phone 都启用了蓝牙。
顺便说一下我的回电,如果有人感兴趣的话:
Private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
System.out.println("BLE// onScanResult");
Log.i("callbackType", String.valueOf(callbackType));
Log.i("result", result.toString());
BluetoothDevice btDevice = result.getDevice();
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
System.out.println("BLE// onBatchScanResults");
for (ScanResult sr : results) {
Log.i("ScanResult - Results", sr.toString());
}
}
@Override
public void onScanFailed(int errorCode) {
System.out.println("BLE// onScanFailed");
Log.e("Scan Failed", "Error Code: " + errorCode);
}
};
现在您可以看到扫描没有失败,因为 Logcat 没有给我扫描失败的日志,但显然它也没有找到任何设备...
Logcat:
06-07 17:13:02.622 16802-16802/com.example.joey.findmycar I/start: Starting scan...
06-07 17:13:02.802 16802-16802/com.example.joey.findmycar W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView)
06-07 17:13:02.882 16802-16802/com.example.joey.findmycar I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@c8fddba time:699666571
06-07 17:13:14.632 16802-16802/com.example.joey.findmycar I/start: Stopping scan...
我已将正确的权限添加到我的清单中:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
我已经尝试了几乎所有的可能性,并且开始认为我的 phone 上的蓝牙可能会以某种方式损坏,这很奇怪,因为我可以手动检测并连接到 Android 中的设备设置。
我在 Android 6.0 API 中找到了这个 updates:
改进的蓝牙低功耗扫描
如果您的应用程序执行低功耗蓝牙扫描,请使用新的 setCallbackType() 方法指定您希望系统在首次发现或长时间后看到与集合匹配的广告数据包时通知回调扫描过滤器。这种扫描方法比以前平台版本中提供的方法更省电。
如果您扫描心率监测器或接近传感器等 BLE 设备,您的代码应该可以正常工作。问题可能是使用此代码您的应用程序是 GATT 客户端并且正在搜索 GATT 服务器。
因此,如果您想连接到另一个 phone,您可以编写一个 GATT 服务器应用程序,然后 运行 它在另一个 phone 上(如最后一段所示 here)
有完整的文档 google 你仔细阅读它:
https://developer.android.com/guide/topics/connectivity/bluetooth-le.html
我在使用 Samsung Galaxy s5 进行蓝牙扫描设备时遇到了一些问题。
我使用的是 Android 6.0 并已为我的应用程序设置权限,以便像这样进行扫描:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
// Android M Permission check
if (this.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("This app needs location access");
builder.setMessage("Please grant location access so this app can devices.");
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
public void onDismiss(DialogInterface dialog) {
requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
}
});
builder.show();
}
我认为这是正常工作的,因为我收到弹出窗口询问我接受的权限。
我的扫描功能:
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
Log.i("start" , "Stopping scan...");
mBluetoothLeScanner.stopScan(mScanCallback);
}
}, SCAN_PERIOD);
mScanning = true;
Log.i("start" , "Starting scan...");
mBluetoothLeScanner.startScan(mScanCallback);
} else {
mScanning = false;
mBluetoothLeScanner.stopScan(mScanCallback);
}
}
现在它停止并正确开始扫描,因为 Logcat 正在给我日志。但它只是没有找到任何设备,这真的很奇怪,因为我坐在我的笔记本电脑旁边,第二个 phone 都启用了蓝牙。
顺便说一下我的回电,如果有人感兴趣的话:
Private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
System.out.println("BLE// onScanResult");
Log.i("callbackType", String.valueOf(callbackType));
Log.i("result", result.toString());
BluetoothDevice btDevice = result.getDevice();
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
System.out.println("BLE// onBatchScanResults");
for (ScanResult sr : results) {
Log.i("ScanResult - Results", sr.toString());
}
}
@Override
public void onScanFailed(int errorCode) {
System.out.println("BLE// onScanFailed");
Log.e("Scan Failed", "Error Code: " + errorCode);
}
};
现在您可以看到扫描没有失败,因为 Logcat 没有给我扫描失败的日志,但显然它也没有找到任何设备...
Logcat:
06-07 17:13:02.622 16802-16802/com.example.joey.findmycar I/start: Starting scan...
06-07 17:13:02.802 16802-16802/com.example.joey.findmycar W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView)
06-07 17:13:02.882 16802-16802/com.example.joey.findmycar I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@c8fddba time:699666571
06-07 17:13:14.632 16802-16802/com.example.joey.findmycar I/start: Stopping scan...
我已将正确的权限添加到我的清单中:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
我已经尝试了几乎所有的可能性,并且开始认为我的 phone 上的蓝牙可能会以某种方式损坏,这很奇怪,因为我可以手动检测并连接到 Android 中的设备设置。
我在 Android 6.0 API 中找到了这个 updates:
改进的蓝牙低功耗扫描
如果您的应用程序执行低功耗蓝牙扫描,请使用新的 setCallbackType() 方法指定您希望系统在首次发现或长时间后看到与集合匹配的广告数据包时通知回调扫描过滤器。这种扫描方法比以前平台版本中提供的方法更省电。
如果您扫描心率监测器或接近传感器等 BLE 设备,您的代码应该可以正常工作。问题可能是使用此代码您的应用程序是 GATT 客户端并且正在搜索 GATT 服务器。
因此,如果您想连接到另一个 phone,您可以编写一个 GATT 服务器应用程序,然后 运行 它在另一个 phone 上(如最后一段所示 here)
有完整的文档 google 你仔细阅读它:
https://developer.android.com/guide/topics/connectivity/bluetooth-le.html