首页 文章

需要在Android 6.0上启用蓝牙低功耗扫描的位置

提问于
浏览
67

升级到Android版本6.0后,只有在设备上启用了位置服务时,蓝牙低功耗(BLE)扫描才有效 . 请参阅此处以供参考:Bluetooth Low Energy startScan on Android 6.0 does not find devices

基本上,您需要为应用程序以及手机启用权限 . 这是一个错误吗?是否可以在没有实际启用位置服务的情况下扫描?我不想拥有所有应用的位置 .

EDIT 我没有提到我在API 21中提供的 BluetoothLeScanner 中使用了 startScan() 方法 . 我对此方法所需的清单中的课程和精确位置权限没问题 . 我只是不希望我的应用程序的用户必须在他们的设备(GPS等)上启用位置服务才能使用我的应用程序 .

以前, startScan() 方法将在手机上禁用位置服务的情况下运行并返回结果 . 但是,在Marshmallow上,相同的应用程序会_1618991_但是静默失败并且在手机上未启用位置服务且课程/精确位置权限仍在清单中时未返回任何结果 .

6 回答

  • 10

    不,这不是一个错误 .

    这个issue被提交给谷歌,他们回应说这是预期的行为,他们不会修复它 . 他们指示开发人员在this site指出现在需要位置权限才能访问硬件标识符 . 现在,开发人员有责任让用户了解该要求 .

    然而,在这个问题中,它没有解决为什么需要定位服务(GPS等),并且似乎他们不会重新讨论这个问题来解释这一点,因为它已被标记为预期的行为 .

    要回答问题的第二部分:是的,可以在不启用位置服务的情况下进行扫描 . 您可以使用 BluetoothAdapter.getDefaultAdapter().startDiscovery() 进行蓝牙经典扫描,这将关闭位置服务 . 这将发现所有蓝牙设备,BLE和其他 . 但是,如果BLE设备被视为 startScan() 的结果,它们将没有扫描记录 .

  • 2

    我通过在gradle文件中将 targetSdkVersion 设置为 22 来解决这个问题 . 您必须在清单中声明 ACCESS_COARSE_LOCATION ,但即使用户从应用设置中拒绝此权限,BLE扫描也会起作用 .

    这只是一个避免请求位置许可的黑客行为 . 最好定位最新的Android版本 .

  • 45

    我发现在Android 6之后你必须授予ACCESS_COARSE_LOCATION权限 . 但在某些设备上还需要打开手机定位服务(GPS),以便发现外围设备 . 我发现使用Nexus 5x和Android 7.0 .

  • 0

    我也在清单上试过这个,但没有请求许可,不知道为什么 . 你是应用程序在启动时提示输入位置权限吗?如果不是,我们需要request for permission on runtime .

    此外,您可以检查此项以测试您的应用是否正常运行:

    打开设置>应用> YourApplication>权限并启用位置,然后尝试扫描结果 .

    只有在清单上提供了ACCESS_COARSE_LOCATION时,才会在此处列出位置 .

  • 2

    你可以使用 BluetoothAdapter.startDiscovery() .
    它将扫描蓝牙智能和经典蓝牙设备,但不需要启用位置服务 .
    (Android 6上仍需要 ACCESS_COARSE_LOCATION 权限 . )

    您可以在找到的设备上拨打BluetoothDevice.getType来过滤蓝牙智能/低功耗设备 .

  • 6

    好吧,我查看了我在Eclipse中编写的代码,并在那里使用了startScan(API 21)函数,而没有在清单文件中声明位置内容 . 我仍然得到适当的回调 . 您是否尝试过在没有位置声明的情况下运行代码?另一方面 - 您可以使用不需要这些权限的已弃用的startLeScan(API 18) . 但是,在我看来,使用API 18方法搜索和阅读服务中所需的特性更加复杂 .

相关问题