2017-02-01 10 views
0

После спаривания с BLE устройства функция android.bluetooth.BluetoothDevice.setPairingConfirmation называется, и это делает сбой приложения:приложения начинает врезаться с конца декабря 2016 года в setPairingConfirmation из-за отсутствующего разрешения BLUETOOTH_ADMIN

Fatal Exception: java.lang.SecurityException: Need BLUETOOTH PRIVILEGED permission: Neither user 10168 nor current process has android.permission.BLUETOOTH_PRIVILEGED. at android.os.Parcel.readException(Parcel.java:1684) at android.os.Parcel.readException(Parcel.java:1637) at android.bluetooth.IBluetooth$Stub$Proxy.setPairingConfirmation(IBluetooth.java:1566) at android.bluetooth.BluetoothDevice.setPairingConfirmation(BluetoothDevice.java:1182) at nl.myapp.ui.main.NotificationFragment.onDeviceSelected(SourceFile:374) at nl.myapp.ui.main.FindGlassDialogFragment.onDeviceClicked(SourceFile:224) at nl.myapp.ui.main.adapters.DeviceAdapter$2.onClick(SourceFile:61) at android.view.View.performClick(View.java:5637) at android.view.View$PerformClick.run(View.java:22429) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

приложение работает нормально, когда он был разработан. Когда я поворачиваю линию device.setPairingConfirmation(), приложение работает, но устройство Bluetooth не останавливает режим сопряжения.

У меня есть

<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> в мой манифест и я попросить разрешения выполнения ACCESS_COARSE_LOCATION в Android версии M и выше.

Я пробовал запрашивать BLUETOOTH_ADMIN и BLUETOOTH_PRIVILEGED как разрешение времени выполнения, но они не запрашивают диалог.

Это ошибка в текущей версии Android? Я уверен, что приложение не сбой, когда оно было выпущено 13 декабря.

Это происходит на Android 6 и 7. Я тестировал его на Nexus 6P с Android 7.1.1.

+2

Ваше приложение не может держать 'BLUETOOTH_PRIVILEGED' как это разрешение «подпись | привилегированное», если ваше приложение не подписано ключом подписи прошивки или не установлено как системное («привилегированное») приложение. 'setPairingConfirmation()' документируется как требование 'BLUETOOTH_PRIVILEGED', поэтому, по-видимому, это работает по назначению. Я не могу объяснить, как это работает раньше, и я не знаю, каким будет обходной путь, если он есть. – CommonsWare

+0

Возможный дубликат [Android Permission BLUETOOTH Manifest error] (http://stackoverflow.com/questions/29786291/android-permission-bluetooth-manifest-error) – petey

+0

Итак, разрешение BLUETOOTH_PRIVILEGED недоступно для 3-х сторонних приложений. Теперь я читаю в документации. Но когда я смотрю на источник setPairingConfirmation(), он требует BLUETOOTH_ADMIN. Возможно, Google изменил это в обновлении безопасности ... – Roel

ответ

0

Разрешение Bluetooth может быть отключено, даже если вы пишете разрешение в манифесте. Пользователи имеют право отказаться от некоторых разрешений. вы должны попросить пользователей предоставить грандиозное разрешение во время выполнения. эта ссылка поможет вам Android requesting permission from the user

Вы можете подтвердить, что разрешение выключен или не будет настройки -> Установленные приложения -> найти приложение затем искать его разрешения

+1

Разрешения Bluetooth не являются разрешениями во время выполнения. Когда я запрашиваю их во время выполнения, они не запрашиваются. – Roel

+0

Вы проверили, что разрешение отключено или включено внутри настроек. – niju

+1

В результате Google изменил что-то в обновлении безопасности, так что setPairingConfirmation() больше не доступно для внешних приложений. Он может использоваться только одобренными приложениями и системой Android. Он требует BLUETOOTH_PRIVILEGED теперь вместо BLUETOOTH_ADMIN (до конца декабря 2016 года). Я думаю, мне не нужна функция, и я неправильно понял ее использование. – Roel