Android 5.0.2以后不允许通过蓝牙LE进行HID访问

时间:2015-06-01 17:27:46

标签: android bluetooth-lowenergy gatt

我的应用程序运行正常,直到Android 5.0.2不允许第三方应用程序通过蓝牙低功耗连接到HID设备。

myGatt.setCharacteristicNotification(gattChar, true);

06-01 17:39:35.356: W/BluetoothGatt(21599):
java.lang.SecurityException: Need BLUETOOTH_PRIVILEGED permission:Neither
user 10157 nor current process has android.permission.BLUETOOTH_PRIVILEGED.

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

BLUETOOTH_PRIVILEGED权限不适用于第三方应用。它仅适用于系统或制造商应用。

Android注释的最新变化: 对HID-over-GATT实施BLUETOOTH_PRIVILEGED权限 https://android.googlesource.com/platform/packages/apps/Bluetooth/+/02bebee

Code snippet:

private static final UUID[] HID_UUIDS = {
    UUID.fromString("00002A4A-0000-1000-8000-00805F9B34FB"),
    UUID.fromString("00002A4B-0000-1000-8000-00805F9B34FB"),
    UUID.fromString("00002A4C-0000-1000-8000-00805F9B34FB"),
    UUID.fromString("00002A4D-0000-1000-8000-00805F9B34FB") };

if (isHidUuid(charUuid)) enforcePrivilegedPermission();

我的问题:有没有办法覆盖HID_UUIDS或enforcePrivilegedPermission?通过它可以使用反射吗?

每次Android发布新版本时,都会破坏之前的代码。

谢谢!

1 个答案:

答案 0 :(得分:1)

这个问题很旧,但仍然值得回答。 HID(和FIDO https://fidoalliance.org/)服务受到保护,确实需要系统权限source。只有使用系统密钥签名的应用才能使用此服务,即仅蓝牙设置。这是为了确保第3方应用程序无法收听无线键盘上键入的键,因为所有通知和指示都将传输到所有BluetoothGatt对象。没有这种保护,您将能够连接到HID设备(仍然可以),使用gatt.setCharacteristicNotification(..,true)启用通知,并在键入任何密钥时接收更新。有了一些有关报表特征的知识,您就可以获取所有键和鼠标的位置,包括密码等。因此,这不是休息,而是漏洞修复。在KitKat上,您仍然可以这样做。

唯一的解决方案是编译您自己的AOSP Android版本并使用相同的密钥对您的应用程序进行签名。否则,它将是无用的保护。

顺便说一句,从Android 8或更早版本开始,您没有获得SecurityException。就像其他任何调用一样,该调用仅返回true,并且您永远不会得到任何回调。 这可能已在此处更改:https://android.googlesource.com/platform/packages/apps/Bluetooth/+/32dc7a6b919375aede777f3c821fa316d85449ae%5E%21/#F2