Android studio BluetoothLeScanner从不调用任何回调方法

Android studio BluetoothLeScanner从不调用任何回调方法,android-studio,kotlin,bluetooth-lowenergy,Android Studio,Kotlin,Bluetooth Lowenergy,我对Android和Kotlin非常陌生,所以我可能会犯一些非常简单的错误,但就我调用BluetoothLeScanner.startScan()时所见,我创建的ScanCallback类中所有可能的回调方法都没有被调用过 我知道在API级别23及以上,仅仅将位置权限放在清单中可能是不够的,所以我已经编写了代码来处理这个问题&我很满意我的应用程序既有粗略的位置权限,也有精细的位置权限 以下是我对OnScanResult方法的重写: override fun onScanResult(callba

我对Android和Kotlin非常陌生,所以我可能会犯一些非常简单的错误,但就我调用BluetoothLeScanner.startScan()时所见,我创建的ScanCallback类中所有可能的回调方法都没有被调用过

我知道在API级别23及以上,仅仅将位置权限放在清单中可能是不够的,所以我已经编写了代码来处理这个问题&我很满意我的应用程序既有粗略的位置权限,也有精细的位置权限

以下是我对OnScanResult方法的重写:

override fun onScanResult(callbackType: Int, result: ScanResult?) {
    super.onScanResult(callbackType, result)
    mScan = true
}
我在每个回调方法中都设置了一个断点,当代码运行时,当我将鼠标悬停在这些断点上时,我看到消息“在第行中找不到可执行代码…”这是一条非常令人不安的消息(我怀疑它指向了问题所在),但是(a)当一切都正常构建时,那里怎么可能没有代码你怎么办? 最新消息:我认为这条消息是在转移视线。现在,我已经将断点移到回调函数中的其他位置,不再看到“无可执行代码”消息。看起来Android Studio可以让你在一行上放一个断点,但里面没有实际的代码! 所以我们回到了最初的问题——为什么我们没有收到回电

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


非常感谢您的建议(我认为只有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注意安全所有

您必须实际启用手机上的GPS,才能获得扫描回拨功能启用手机上的GPS在我看来与给予定位许可一样。有区别吗?对于BLE,您只需要粗略的位置,而不需要精细的位置。