Вопрос: Существует еще один способ проверки доступа к уведомлениям, который более точен, чем использование NotificationManagerCompat.getEnabledListenerPackages()
?
Объяснение того, что происходит с моим кодом:
В моем приложении есть служба для чтения уведомлений, поэтому он проверяет наличие или отсутствие разрешения на это в своем методе инициализации.
Проблема в том, что код, который проверяет, возвращается ли это разрешениеfalse
сразу после того, как я предоставил доступ к уведомлениям (init()
вызывается на onListenerConnected()
, который является методом NotificationListenerService
, а внутри init()
есть hasPermission()
, который портит мое приложение).
* * * * * * * * * * * * hasPermission()
было довольно просто, но для исследования я сделал несколько изменений:
class PermissionsManager {
// ...
public static boolean hasPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
return false;
}
boolean permission = false;
for (int i = 0; i < 100; i++) {
permission = NotificationManagerCompat
.getEnabledListenerPackages(context)
.contains(context.getPackageName());
Log.d(TAG, "permission to access notifications: " + (permission ? "granted" : "denied"));
if (permission) break;
}
return permission;
}
}
, и затем я понял, что NotificationManagerCompat.getEnabledListenerPakcages()
просто не обновлялся достаточно быстро:
01-23 09:45:39.008 I/chatty: uid=10251 com.example.app:notifications identical 5 lines
01-23 09:45:39.008 D/PermissionsManager: permission to access notifications: denied
01-23 09:45:39.009 D/PermissionsManager: permission to access notifications: denied
01-23 09:45:39.009 I/chatty: uid=10251 com.example.app:notifications identical 5 lines
01-23 09:45:39.010 D/PermissionsManager: permission to access notifications: denied
01-23 09:45:39.011 D/PermissionsManager: permission to access notifications: granted
Ранее я использовал следующий код для получения разрешения, но он имеет тот же результат:
ComponentName cn = new ComponentName(context, CustomNotificationListenerService.class);
String flat = Settings.Secure.getString(context.getContentResolver(), "enabled_notification_listeners");
return flat != null && flat.contains(cn.flattenToString());