我的应用程序运行正常,直到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发布新版本时,都会破坏之前的代码。
谢谢!
答案 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