Есть ли способ получить историю уведомлений устройства? - PullRequest
11 голосов
/ 23 марта 2019

Я занимаюсь разработкой приложения статистики использования, и мне интересно, как другие приложения могут получить доступ к истории уведомлений устройств .

Сейчас я работаю с NotificationListenerService,но это может обрабатывать только новые уведомления, а не прошлые.Я проверил Android DOC и обнаружил некоторые методы, которые являются «только системными», например getHistoricalNotifications(), или для которых требуется разрешение ACCESS_NOTIFICATION.

Дело в том, что есть несколько приложений, которые действительно могут получить доступ к данным истории уведомлений.

Android DOC также показывает новый API на Android Q под названием NotificationStats, но недоступенна данный момент.

Есть советы?Возможно ли это вообще без хакерства?

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

ActionDash показывает это enter image description here

Как упоминалось вами, getHistoricalNotifications - это API-интерфейс системного уровня, доступ к которому получают только системные приложения, поэтому Google Digital Wellbeing, являясь системным приложением, может показать это.

Так что я думаю, что нет способа получить историю уведомлений для сторонних приложений.

/**
         * System-only API for getting a list of recent (cleared, no longer shown) notifications.
         *
         * Requires ACCESS_NOTIFICATIONS which is signature|system.
         */
        @Override
        public StatusBarNotification[] getHistoricalNotifications(String callingPkg, int count) {
            // enforce() will ensure the calling uid has the correct permission
            getContext().enforceCallingOrSelfPermission(
                    android.Manifest.permission.ACCESS_NOTIFICATIONS,
                    "NotificationManagerService.getHistoricalNotifications");

            StatusBarNotification[] tmp = null;
            int uid = Binder.getCallingUid();

            // noteOp will check to make sure the callingPkg matches the uid
            if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ACCESS_NOTIFICATIONS, uid, callingPkg)
                    == AppOpsManager.MODE_ALLOWED) {
                synchronized (mArchive) {
                    tmp = mArchive.getArray(count);
                }
            }
            return tmp;
        }
0 голосов
/ 23 марта 2019

Вы должны сохранять данные уведомлений приложения, когда уведомление получено в базу данных sql, и когда вы хотите получить историю уведомлений соответствующего приложения, вы можете легко получить все уведомления, поместив запрос в базу данных sql.

...