Java BluetoothLescan()找不到任何设备
我在使用三星Galaxy s5进行蓝牙设备扫描时遇到了一些问题 我使用的是Android 6.0,并已设置我的应用程序的扫描权限,如下所示:Java BluetoothLescan()找不到任何设备,java,android,android-ble,Java,Android,Android Ble,我在使用三星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
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正在给我日志。但它只是找不到任何真正奇怪的设备,因为我坐在笔记本电脑和第二部手机旁边,这两部手机都启用了蓝牙
顺便说一下,如果有人感兴趣,这是我的回电:
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);
}
};
我已将正确的权限添加到清单中:
<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" />
我尝试了几乎所有的可能性,并开始认为我手机上的蓝牙可能会以某种方式被破坏,这很奇怪,因为我可以在Android设置中手动检测并连接到设备。我在Android 6.0 API中发现了这一点: 改进的蓝牙低能量扫描
如果您的应用程序执行蓝牙低能量扫描,请使用新的setCallbackType()方法指定您希望系统在首次找到或很长时间后看到与set-ScanFilter匹配的广告包时通知回调。这种扫描方法比以前的平台版本更省电。如果您正在扫描诸如心率监视器或接近传感器之类的BLE设备,您的代码应该可以正常工作。问题可能是,使用此代码,您的应用程序就是GATT客户端,正在搜索GATT服务器
因此,如果你想连接到另一部手机,你可以编写一个GATT服务器应用程序,并在另一部手机上运行它(如最后一段所示)谷歌提供了完整的文档,你可以查看它:
既然你已经在安卓6上试过了,你也试过给予定位许可吗?从安卓6开始,在扫描可移动设备时必须启用定位。因此,您需要为location请求运行时权限,同时确保location services也已启用(设置>位置>打开),就好像该功能已关闭一样,即使您具有位置“权限”,您也不会收到任何扫描结果。看起来您的超时设置为大约10秒,对吗?如果在调用其中一个回调之前让它继续,会发生什么情况?@kcoppock我尝试过启用它,但这似乎并不重要,扫描时仍然没有结果。@DanielNugent Ye过去扫描大约10秒,尝试将其增加到100,没有什么不同。
<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" />