Unity - Android - BLE 蓝牙权限

Posted

技术标签:

【中文标题】Unity - Android - BLE 蓝牙权限【英文标题】:Unity - Android - BLE Bluetooth Permissions 【发布时间】:2021-11-26 11:18:44 【问题描述】:

我想知道是否有人知道是否可以将蓝牙低功耗模块连接到 android 设备而无需请求位置权限或调出配套设备配对屏幕。

我创建了一个尝试连接到 BLE 设备的统一项目,并且我已经在 ios 上对此进行了测试,并且连接工作顺利且没有问题,但是当加载到 Android 设备上时,我遇到了配套设备配对屏幕,显示不同 wifi 和蓝牙设备的完整列表。选择后,将出现另一个请求访问用户位置的权限的屏幕。整个过程相当笨拙,虽然我最终能够连接,但应用程序经常退出或反复调出配套设备配对屏幕,并阻止应用程序完全加载或连接到 BLE 设备。

我相信这些是由于包含对这两个函数的引用的 android 清单文件(我在下面包含的)引起的。但是,当我删除这些时,应用程序无法打开,通常在启动时崩溃或退出。

或者,如果需要这些,可能有人可以就如何在配套设备搜索中实现过滤器提供一些建议(这样我只能列出相关的 BLE 设备,而不是所有 WIFI 和蓝牙的长列表设备)。我在官方 android 开发者网站上找到了对此的参考,但是我在弄清楚如何在我的统一项目中正确实现这一点时遇到了一些麻烦。

配套设备过滤器链接:

https://developer.android.com/guide/topics/connectivity/companion-device-pairing#filter

清单文件:

    <uses-permission android:name="android.permission.BLUETOOTH"/>

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

<uses-permission-sdk-23 android:name="android.permission.BLUETOOTH"/>

<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>

<uses-permission android:name="android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND"/>

<uses-permission android:name="android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND"/>

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

<uses-feature android:name="android.software.companion_device_setup"/>

如果有人能够提供任何建议,将不胜感激。

谢谢!

【问题讨论】:

您需要使用配套设备配对吗? 我通过阅读 android 开发人员描述的理解是,通过使用配套设备配对,我可以避免在连接到设备时请求用户位置的许可(如果可能的话,我真的喜欢做)。我试图在清单文件中删除对 this 的引用,但这似乎会导致应用程序崩溃或退出。 包括配套设备配对应该允许您摆脱“ACCESS_FINE_LOCATION”权限。如果没有配套设备配对,您仍然需要允许位置请求,但只允许一次。您可以在没有提示的情况下过滤 BLE 设备,并且只需要询问是否有多个设备可供选择 谢谢。如果可能的话,我更喜欢使用配套设备配对,以避免提示用户位置。我不认为您对如何实现蓝牙设备过滤器以便仅显示 BLE 设备有一个粗略的了解?目前,我正在获取 WIFI、蓝牙经典和 BLE 设备的完整列表。我不太确定如何在 Unity 中实现这一点。如果没有,也不是问题,感谢您的时间和帮助! 【参考方案1】:

要过滤配套设备配对对话框,请查看来自 google 的 this guide。

您可以选择将setSingleDevice() 设置为true 并仅显示一个可供选择的设备或使用以下类型之一的DeviceFilter 过滤列表:

BluetoothDeviceFilter BluetoothLeDeviceFilter WifiDeviceFilter

这可能看起来像这样:

BluetoothDeviceFilter deviceFilter = new BluetoothDeviceFilter.Builder()
        // Match only Bluetooth devices whose name matches the pattern.
        .setNamePattern(Pattern.compile("My device"))
        // Match only Bluetooth devices whose service UUID matches this pattern.
        .addServiceUuid(new ParcelUuid(new UUID(0x123abcL, -1L)), null)
        .build();

【讨论】:

谢谢迈克尔。我确实已经遇到过这个问题,但主要不确定如何在 Unity 中实现它。我正在使用 C sharp 脚本进行连接,但不确定如何使用此代码,因为它是用 Kotlin / Java 编写的。对于我在这里缺乏理解,我深表歉意,我正在尝试了解如何使用它,但在这方面的知识有限。 哦,对不起!我忽略了统一部分。我没有任何集成 Android 和 Unity 的经验,抱歉 没问题迈克尔,无论如何感谢您的帮助。我将继续研究这个问题,所以如果我知道如何确保将结果留在此处。

以上是关于Unity - Android - BLE 蓝牙权限的主要内容,如果未能解决你的问题,请参考以下文章

Android ble (蓝牙低功耗) 中的坑和技巧

Android 低功耗蓝牙(Ble) 开发总结

Android BLE蓝牙踩坑总结

android蓝牙BLE(三) —— 广播

Android低功耗蓝牙(蓝牙4.0)——BLE开发(上)

Android 低功耗蓝牙 (BLE) 环回