Я пытаюсь получить разрешение BIND_NOTIFICATION_LISTENER_SERVICE
, предоставленное пользователем. Для этого я открываю приложение настроек в правильном месте, используя:
Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
startActivity(intent);
Что уже странно, так это то, что Настройки открываются дважды (если вы нажмете кнопку «Назад» один раз, снова откроется тот же экран настроек)
Однако в onResume()
я затем проверяю, было ли предоставлено разрешение, используя:
if(ContextCompat.checkSelfPermission(context,Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE)== PackageManager.PERMISSION_GRANTED){
//open next activity
}
И вот проблема: не имеет значения, предоставил ли пользователь разрешение в настройках, потому что checkSelfPermission()
всегда возвращает PERMISSION_DENIED
.
И теперь становится действительно странно: мой NotificationListenerService
создан, связан и полностью работает, хотя разрешение не было предоставлено в соответствии с checkSelfPermission()
.
Как я должен узнать, предоставил ли пользователь разрешение?
Декларация разрешений и услуг в моем манифесте:
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" />
<application>
<service
android:name=".service.NotificationListener"
android:directBootAware="true"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
</application>
My NotificationListenerService
:
public class NotificationListener extends NotificationListenerService {
private static final String TAG = NotificationListener.class.getSimpleName();
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
super.onNotificationPosted(sbn);
Log.d(TAG, "onNotificationPosted: "+sbn.getNotification().tickerText + " ;" + sbn.getPackageName());
}
}
Что я уже пробовал:
- Разные устройства и уровни API (включая эмуляторы) -> Везде одна и та же проблема
PermissionChecker.checkSelfPermission
(не знаю, в чем разница по сравнению с ContextCompat.checkSelfPermission(), но возвращает тот же результат)- Android Bug Tracker -> нет известных проблем