如何在“请勿打扰”设置中的“优先级应用程序通知”下find允许的应用程序?

我正在尝试以编程方式找出特殊情况下绕过“请勿打扰”设置的应用程序。

在此处输入图像描述

到目前为止,我使用以下代码检查手机是否设置为“请勿打扰”模式:

public static boolean isDnDModeEnabled(Context context) { if(Build.VERSION.SDK_INT <23) return false; try { NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); int filterValue = notificationManager.getCurrentInterruptionFilter(); switch(filterValue) { case NotificationManager.INTERRUPTION_FILTER_ALL : Log.d("DND","Interruption filter all"); break; case NotificationManager.INTERRUPTION_FILTER_ALARMS : Log.d("DND","Interruption filter alarms"); break; case NotificationManager.INTERRUPTION_FILTER_PRIORITY : Log.d("DND","Interruption filter priority"); break; case NotificationManager.INTERRUPTION_FILTER_UNKNOWN : Log.d("DND","Interruption filter unknown"); break; case NotificationManager.INTERRUPTION_FILTER_NONE : Log.d("DND","Interruption filter none"); break; } if(filterValue == NotificationManager.INTERRUPTION_FILTER_ALL) return false; else if(filterValue == NotificationManager.INTERRUPTION_FILTER_PRIORITY) { //Logic based on which apps are allowed as priority return true; //or false } else return true; } catch(Exception e) { return false; } } 

当我点击优先级应用程序通知选项卡时,我会获得所有已安装应用程序的列表,我可以从中选择允许哪些应用程序作为优先级例外。

我的问题是如何以编程方式获取允许作为“请勿打扰”模式的优先级例外的应用程序列表,从而定义替换上述代码中的注释的逻辑? 任何解决方案都将被彻底赞赏

您正在寻找一种方法来确定系统上哪些应用程序具有Notification.IMPORTANCE_MAX的通知重要性,很抱歉,但非系统应用程序无法做到这一点。 您需要访问getImportance(packageName)才能调用getImportance(packageName) 。 请参阅Notification Manager来源,但它会受到检查的保护 ,确保您是系统应用程序或您传递的程序包的应用程序,因此反映出来了……

Google允许应用程序通过NotificationManager使用getImportance()获取自己的通知重要性( 请参阅文档 ),但不能使用任意包调用它。

这里的另一个答案是从系统设置应用程序中查看源代码,这正是我所做的,经过一段时间跟踪代码后,我发现了他们如何确定应该在“覆盖请勿打扰”菜单中显示哪些应用程序通过此代码,这使我走上了发现如何确定IMPORTANCE_*的道路

对不起,但其他回答者提出的建议也不会起作用,因为它们不正确(packages.xml没有信息)或者要求root在所有设备上都不可靠。

您可以尝试以下事项(其中一些可能需要权限访问):

  1. 下载设置应用的源代码,并查看应用设置如何获取列表。
  2. 分析packages.xml。通常有很多关于应用程序的信息存储在那里。
  3. 检查列表是否存储在settings.db中