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

时间:2014-02-04 12:56:36

标签: android alarmmanager android-alarms

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

如果没有 - 如果我能够逐步获得用户设置的所有活动警报的列表,我也会感到满意(我可以从每个警报中提取它将响铃的确切时间..)

到目前为止我尝试了什么:

我知道有一种方法可以将格式化字符串转换为下一个警报:

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

此方法返回某些设备(例如所有三星Galaxy系列..)一个空字符串,即使设置了警报(由三星原生闹钟应用程序..)。我敢打赌,它仅适用于具有默认警报应用程序的nexus设备。

我想获得一种可以以任何方式工作的通用解决方案。

TIA

更新

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

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

我只想知道用户隐含设置的警报,尤其是他为唤醒而激活的警报。

我的最终目标是暗示用户醒来。那就是..

5 个答案:

答案 0 :(得分:5)

嗨,好像我在派对上迟到了,但无论如何,这里是我可以挖掘的东西。

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

我检查了Note3中的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设备上使用。

意图行动的包裹名称给了我进一步的提示,我找到了答案

2.)如果我能逐步获得用户设置的所有活动警报列表,我也会感到满意

似乎clockpackage在“com.samsung.sec.android.clockpackage/alarm”位置公开了一个内容提供者,我可以查询用户从该DB设置的所有警报(启用/禁用/名称/暂停详细信息等)。

通过切换启用/禁用按钮,我认为打开/关闭警报的值在第1列(列从0索引开始)。如果您想要更多数据,我建议在SQlite数据库浏览器中提取数据库并查看表结构(设备可能必须根植于拉动整个数据库)。

类似的DB也必须存在于其他Android设备上(我打破了我的nexus其他可能已经测试过的)欢呼声

答案 1 :(得分:2)

默认时钟应用 - com.android.deskclock - 有ClockProvider支持查询,
但不幸的是,it's not exported因此第三方应用无法使用它。

答案 2 :(得分:1)

高度怀疑你会找到解决方案。

警报由AlarmManagerService维护。由于它不包含在SDK中,因此反射可能是获取某些东西的唯一方法。但从它的外观来看,即使反思也无法帮助你:

  • 需要访问AlarmManagerService $ Batch#alarms< --- ArrayList<警报>
  • 需要访问AlarmManagerService#mAlarmBatches< --- ArrayList<批量>
  • 使用反射:
    • 类< ? > ams = Class.forName(“com.android.server.AlarmManagerService”)
    • 字段mAlarmBatches = ams.getDeclaredField(“mAlarmBatches”)
    • Object listOfBatches = mAlarmBatches.get(????)
    • 粘住

对我来说似乎是个死路一条。您无法实例化AlarmManagerService - 甚至无法访问和调用其构造函数(因为它调用本机方法)。

另一种推理:以下是AlarmManagerService$Alarm类:

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

答案 3 :(得分:1)

您无法在AlarmManager查询命令列表,这是您需要执行此操作的目的。

您最接近查找警报列表的方法是使用dumpsys adb shell dumpsys alarm,但显然您无法在代码中执行此操作。

答案 4 :(得分:1)

如果我理解你正确,你想要检查哪些应用程序使用Alarm Manager类,如果是这种情况,那么你可以通过允许你的应用程序监视log cat来完成它,一旦完成你肯定会知道哪个应用程序正在使用警报至少这应该在启动时工作。您可以创建一个新线程来在后台运行logcat(不带选项-d)。另外,请确保在Manifest中添加所需的权限才能使其正常工作。

启动时间的屏幕截图:

enter image description here

更新:使用默认系统时钟

在9:56 pm设置闹钟后的LogCat

通过原始问题的更新了解OP的要求后,我尝试设置特定时间的警报并同时检查LogCat,结果记录在下面,时间详细信息和事件按时间顺序排列:

enter image description here

This might be of interest as well