#android #android-service #android-permissions #android-service-binding
#Android #android-сервис #android-разрешения #android-привязка к сервису
Вопрос:
Почему этот код работает:
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
666);
## In the manifest
<uses-permission android:name="android.permission.READ_CONTACTS" />
и этот код не работает:
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE},
666);
## In the manifest
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" />
Первый фрагмент запускает действие запроса разрешения с запросом разрешений на чтение контактов.
Последний фрагмент не показывает активность, и в журналах есть это сообщение:
10-16 12:19:48.061 1138-3635/? I/ActivityManager: START u0 {act=android.content.pm.action.REQUEST_PERMISSIONS pkg=com.google.android.packageinstaller cmp=com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity (has extras)} from uid 10147 on display 0
Итак, что я должен делать, чтобы запрашивать разрешения на уведомления?
Целевой API — v24, а минимальная версия sdk — 23.
Комментарии:
1. «Итак, что я должен сделать, чтобы запросить разрешения на уведомления?» — вы этого не делаете. Во-первых, вы избавляетесь от этого Java-кода. Затем вы избавляетесь от этого
<uses-permission>
элемента.BIND_NOTIFICATION_LISTENER_SERVICE
это системное разрешение, которое ваше приложение не может удерживать.
Ответ №1:
ну, разрешения во время выполнения запрашиваются только для опасных разрешений, поскольку служба уведомлений не является опасным разрешением, вам не нужно его спрашивать. вот список всех опасных и не опасных разрешений.
https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous
p.s. независимо от того, является ли разрешение опасным или нормальным, оба должны быть объявлены в манифесте, разница только в запросах во время выполнения.
Ответ №2:
Из документации
BIND_NOTIFICATION_LISTENER_SERVICE
String BIND_NOTIFICATION_LISTENER_SERVICE
Must be required by an NotificationListenerService, to ensure that only the system can bind to it.
Это означает, что оно не обязательно должно предоставляться пользователем во время выполнения. Скорее, оно должно быть объявлено в manifest.xml в разделе NotificationListenerService.
Что-то вроде этого,
<service android:name=".NotificationListener"
android:label="@string/service_name"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
Ответ №3:
Здесь вы можете увидеть список разрешений, которые вы должны запросить https://developer.android.com/guide/topics/security/permissions.html
READ_CALENDAR, WRITE_CALENDAR
КАМЕРА
READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS
ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, RECORD_AUDIO
READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG, WRITE_CALL_LOG, ADD_VOICEMAIL USE_SIP, PROCESS_OUTGOING_CALLS
BODY_SENSORS
SEND_SMS, RECEIVE_SMS, READ_SMS, RECEIVE_WAP_PUSH, RECEIVE_MMS
READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE