NotificationManagerCompat слишком долго обновляет включенные пакеты прослушивателей - PullRequest
0 голосов
/ 23 января 2019

Вопрос: Существует еще один способ проверки доступа к уведомлениям, который более точен, чем использование 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...