检测默认的闹钟应用程序警报

我想知道是否有一种方法(可能是一个系统广播)知道闹钟默认应用程序现在开始振铃。

如果没有,我也会满意,如果我可以得到progrematically列表的所有活动警报已被用户设置(我可以从每个闹钟提取确切的时间,它会响..)

我到目前为止所尝试的是:

我知道有一种方法来获取格式化的string到下一个警报:

String nextAlarm = Settings.System.getString(context.getContentResolver(), Settings.System.NEXT_ALARM_FORMATTED); 

这种方法返回某些设备(如所有三星Galaxy系列..)一个空的string,即使报警设置(由三星本机闹钟应用程序..)。 我敢打赌,它只适用于使用默认警报应用程序的nexus设备。

我想得到一个通用的解决scheme,无论哪种方式。

TIA

UPDATE

我会尽量使我的问题更清楚:

我并不感兴趣(直接)知道AlarmManager所持有的所有PendingIntent

我只想了解用户隐式设置的警报,特别是关于他为唤醒而激活的警报。

我的最终目标是得到暗示,用户醒来 。 而已..

Related of "检测默认的闹钟应用程序警报"

非常怀疑你会find一个解决scheme。

警报由AlarmManagerService维护。 由于它不包含在SDK中,所以reflection可能是唯一的办法。 但是从它的外表来看,即使反思也无法帮到你:

  • 需要访问AlarmManagerService $ Batch#报警<— ArrayList <Alarm>
  • 需要访问AlarmManagerService#mAlarmBatches <— ArrayList <Batch>
  • 使用reflection:
    • Class <? > ams = Class.forName(“com.android.server.AlarmManagerService”)
    • 字段mAlarmBatches = ams.getDeclaredField(“mAlarmBatches”)
    • 对象listOfBatches = mAlarmBatches.get(????)
    • 卡住

似乎对我来说是死胡同。 你不能实例化AlarmManagerService – 甚至AlarmManagerService访问和调用其构造函数(因为它调用本地方法)。

另一种推理 :下面看一下AlarmManagerService$Alarm class:

 public static class Alarm { public int type; public int count; public long when; public long windowLength; public long whenElapsed; // 'when' in the elapsed time base public long maxWhen; // also in the elapsed time base public long repeatInterval; public PendingIntent operation; <<<<<<============Problem============== public WorkSource workSource; .... .... } 

如果可以访问PendingIntent ,那么是什么阻止了他们随意取消警报 – 由其他应用程序设置的警报?

不过,我希望这里有人能帮助你。

链接: AlarmManagerService

你好像我晚了一点晚,但无论如何这里是我可以挖。

1.)广播系统知道闹钟默认应用程序现在开始响铃。

我检查了从我的I/SecExternalDisplayIntents_Java(2797): Intent Recieved .. - com.samsung.sec.android.clockpackage.alarm.ALARM_STARTED_IN_ALERT BroadCast Map value - 7 ADB日志,我可以看到这个日志,每当默认警报响“ I/SecExternalDisplayIntents_Java(2797): Intent Recieved .. - com.samsung.sec.android.clockpackage.alarm.ALARM_STARTED_IN_ALERT BroadCast Map value - 7

我尝试成功地使用动作名称“ com.samsung.sec.android.clockpackage.alarm.ALARM_STARTED_IN_ALERT ”捕获意图。 虽然我高度怀疑这个意图是否可以通过所有的Android设备。

意向行动的包名给了我更多的提示,我find了答案

2.)如果我可以得到用户设置的所有激活警报的编程列表,我也会满意

看起来clockpackage暴露内容提供商在“ com.samsung.sec.android.clockpackage/alarm ”的位置,我可以从这个数据库查询用户设置的所有警报(启用/禁用/名称/贪睡细节等)。

通过切换启用/禁用button,我认为报警开启/closures的值在列1(列从0索引开始)。 Incase你想要更多的数据,我会build议拉动数据库,并查看SQlite数据库浏览器中的表结构(设备可能必须扎根拉整个数据库)。

类似的数据库也必须存在于其他的Android设备(我打破了我的联系,否则可以testing),欢呼

默认的时钟app – com.android.deskclock – 有一个ClockProvider支持查询,
但不幸的是, 它不能被导出,所以它不能被第三方应用程序使用。

您不能查询AlarmManager的命令列表,这是您需要做的,以实现这一点。

你可以find最接近的警报列表将使用dumpsys adb shell dumpsys alarm ,但显然你不能在代码中做到这一点。

如果我理解你是正确的,你想检查哪些应用程序使用Alarm Manager类,如果是这样的话,那么你可以通过允许你的应用程序监视日志猫,一旦完成,你一定会知道哪些应用程序正在使用报警。 至less这应该在启动时工作。 您可以创build一个新的线程来运行logcat(没有选项-d)在后台。 另外请确保您在Manifest中添加了所需的权限,以使其正常工作。

开机时间的屏幕截图:

在这里输入图像说明

使用默认的系统时钟在下午9:56设置闹钟后更新:LogCat

在通过原始问题的更新了解了OP的要求之后,我尝试设置一个特定时间的警报并同时检查LogCat,结果按时间顺序logging下来,并按时间顺序排列:

在这里输入图像说明

这也可能是有趣的