BluetoothLeScanner 从不调用其任何回调方法



我对Android和Kotlin很陌生,所以我可能会遇到一些非常简单的错误,但是据我所知,当我调用BluetoothLeScanner.startScan((时,我创建的ScanCallback类的任何可能的回调方法都没有被调用过。

我知道在 API 级别 23 及以上,仅将位置权限放在清单中可能还不够,所以我编写了代码来处理这个问题,并且对我的应用程序同时具有粗略和精细位置权限感到满意

这是我对OnScanResult方法的覆盖:

override fun onScanResult(callbackType: Int, result: ScanResult?) {
super.onScanResult(callbackType, result)
mScan = true
}

我在每个回调方法中都放置了一个断点,当我在代码运行时将鼠标悬停在这些断点上时,我看到消息"在行中找不到可执行代码..."这是一个非常令人不安的消息(我怀疑它指出了问题所在(,但是(a(当一切正常时,那里怎么可能没有代码,(b(你怎么做? 更新:我认为这个信息是一个红鲱鱼。 我现在已将断点移动到回调函数中的其他位置,并且不再看到"无可执行代码"消息。 看起来Android Studio允许您将断点放在没有实际代码的行上! 所以我们回到最初的问题 - 为什么我们没有得到回调?

看起来现在已经解决了: (1(我确实在手机上发现了与打开位置不同的设置。 它启用了蓝牙扫描。 然而,它实际上没有区别 (2( 看起来真正的问题是对您使用 setDeviceName(( 传递给扫描过滤器生成器的字符串含义的误解。 我们的硬件蓝牙模块中有一个字符串,我们试图扫描它,称为设备名称,我正在扫描它。 当我寻找信标广告数据时,它找到了。

非常感谢您的建议(我认为只有 1 个(

在清单中授予权限与使用它的应用不同。 对于ble,您需要提供位置和蓝牙权限。然后:

  • 在应用程序中(在手机上(浏览打开的应用程序
  • 找到您的应用,然后点击左上角的 3 个点
  • 点击应用信息
  • 权限
  • 将位置切换为开

下面是一个方便的代码:

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 注意所有人的安全

相关内容

最新更新