Есть ли способ получить историю уведомлений устройства?

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

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

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

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

Какие-нибудь советы? Возможно ли это даже не в хакерской манере?

Ответы

Ответ 1

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;
        }

Ответ 2

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