首页 > 解决方案 > Unity - Android - BLE 蓝牙权限

问题描述

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

我创建了一个尝试连接到 BLE 设备的统一项目,我已经在 IOS 上对此进行了测试,并且连接工作顺利且没有问题,但是当加载到 Android 设备上时,我遇到了 Companion Device Pairing 屏幕,其中显示不同 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"/>

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

谢谢!

标签: androidunity3dbluetoothbluetooth-lowenergyandroid-permissions

解决方案


要过滤配套设备配对对话框,请查看来自 google的本指南。

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

这可能看起来像这样:

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();

推荐阅读