我对Android和Kotlin非常陌生,所以我可能会弄错一些非常简单的东西,但就我所看到的,当我调用BluetoothLeScanner.startScan()时,我创建的ScanCallback类的可能回调方法都没有被调用过。
我知道在API级别23及以上,仅仅将位置权限放在清单中可能是不够的,所以我已经编写了代码来处理这一问题&我的应用程序同时具有粗略和精细的位置权限,这让我感到满意
下面是我对OnScanResult方法的覆盖:
override fun onScanResult(callbackType: Int, result: ScanResult?) {
super.onScanResult(callbackType, result)
mScan = true
}我在每个回调方法中都设置了一个断点,当我在代码运行时将鼠标悬停在这些断点上时,我看到消息"No executable code found at line...“这是一个非常令人不安的消息(我怀疑它指出了问题所在),但是(a)当一切正常构建时,怎么会没有代码呢?(b)你对此做了什么?更新:我认为这条信息是在转移注意力。我现在已经将断点移到了回调函数中的其他位置,并且我不再看到“没有可执行代码”的消息。看起来Android Studio允许您在没有实际代码的行上放置一个断点!因此,我们回到了最初的问题--为什么我们没有收到回调?
看起来这个问题现在解决了:(1)我确实在手机上找到了一个与打开位置不同的设置。它启用了蓝牙扫描。然而,这实际上并没有什么不同(2)看起来真正的问题是对使用setDeviceName()传递给ScanFilter构建器的字符串的含义的误解。在我们的硬件蓝牙模块中有一个字符串,我们正在尝试扫描它,它被称为设备名称,我正在扫描它。当我转而寻找Beacon广告数据时,它找到了它。
非常感谢你的建议(我想只有1条)
发布于 2020-03-20 23:03:36
在清单中授予权限与使用它的应用程序不同。对于ble,您需要提供位置和蓝牙权限。然后:
下面是一小段方便的代码:
public void checkPermission() {
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
} else {
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,}, 1);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
} else {
checkPermission();
}
}Ps是安全的
https://stackoverflow.com/questions/57412943
复制相似问题