我正在开发一个使用情况统计应用程序,我想知道其他应用程序如何访问设备通知历史记录。
现在我正在使用NotificationListenerService
,但这只能处理收到的新通知,而不是过去的通知。我检查了Android DOC,发现了一些'系统'的方法,比如getHistoricalNotifications()
,或需要ACCESS_NOTIFICATION
权限。
问题在于,有一些实际上可以访问通知历史数据的应用程序。
Android DOC还在Android Q上显示了一个名为NotificationStats
的新API,但暂时无法使用。
有小费吗?这甚至可能以非黑客的方式进行吗?
正如您所提到的,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;
}
您应该在收到通知到sql数据库时存储应用程序通知数据,并且当您想要相应应用程序通知的历史记录时,您可以通过将查询放入sql数据库来轻松获取所有通知。