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

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

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

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

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

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

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

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

TIA

UPDATE

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

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

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

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

  • 以编程方式在Android中打开屏幕
  • 如何启动一个对话框(像闹钟dimiss /贪睡),可以点击不解锁屏幕
  • 如何debugging从您的应用程序运行哪个AlarmManager报警?
  • Android设置多个警报
  • 如何在Android 4.4中设置准确,重复的警报?
  • 从Android 4.4 Kitkat设置闹钟
  • 在Android 6.0上,Alarm Manager无法在后台运行
  • 三星“应用程序优化”function可在3天后杀死后台应用程序
  • 非常怀疑你会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下来,并按时间顺序排列:

    在这里输入图像说明

    这也可能是有趣的