【问题标题】:detect default alarm clock application alarms检测默认闹钟应用程序警报
【发布时间】:2014-02-04 12:56:35
【问题描述】:

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

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

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

我知道有一种方法可以将格式化字符串获取到下一个警报:

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

此方法为某些设备(例如所有三星 Galaxy 系列..)返回一个空字符串,即使闹钟已设置(通过三星本地闹钟应用程序..)。我敢打赌它只适用于带有默认警报应用的 nexus 设备。

我想要一个通用的解决方案,无论哪种方式都可以。

TIA

更新

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

我没有兴趣(直接)知道所有 PendingIntent 被 AlarmManager 持有

我只想知道用户隐式设置的闹钟,尤其是他为唤醒而激活的闹钟。

我的最终目标是提示用户醒来。就是这样。。

【问题讨论】:

    标签: android alarmmanager android-alarms


    【解决方案1】:

    嗨,看来我参加聚会有点晚了,但无论如何,这就是我可以挖掘的。

    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 设备上使用。

    intent action的包名给了我更多提示,我找到了答案

    2.)如果我能得到用户设置的所有活动警报的进度列表,我也会很满意

    似乎时钟包在“com.samsung.sec.android.clockpackage/alarm”位置公开了一个内容提供程序,我可以从该数据库查询用户设置的所有警报(启用/禁用/名称/贪睡详细信息等)。

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

    类似的数据库也必须存在于其他 android 设备上(我打破了我的联系,否则也可以在上面测试)干杯

    【讨论】:

    • 感谢您的回答,我已经为此付出了努力,但是-正如您自己写的那样-此策略需要对每个电话供应商进行不同的处理(至少),我正在寻找通用的官方android解决方案。好像没有这样的..
    • 谢谢 我非常怀疑 . DB uri 查询方法适用于大多数三星设备 (JBP),因为应用程序公开了 CP,我确信它已完成,以便其他应用程序可以使用此信息。同样基于 URI 的 DB 查询也适用于 S3 和 Note 3 。只需检查 nexus/htc 设备的类似默认包名称,它可能会正常工作:)
    【解决方案2】:

    默认时钟应用程序 - com.android.deskclock - 有一个支持查询的 ClockProvider
    但不幸的是,it's not exported 所以它不能被第三方应用程序使用。

    【讨论】:

      【解决方案3】:

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

      警报由AlarmManagerService 维护。由于它不包含在 SDK 中,因此反射可能是从中获得一些东西的唯一方法。但是从表面上看,即使是反射也无法帮助您:

      • 需要访问 AlarmManagerService $ Batch # 警报
      • 需要访问 AlarmManagerService # mAlarmBatches
      • 使用反射:
        • 类 ams = Class.forName("com.android.server.AlarmManagerService")
        • 字段 mAlarmBatches = ams.getDeclaredField("mAlarmBatches")
        • 对象 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

      【讨论】:

      • 感谢您的回答,您可能是对的.. 现在我已经赞成您的回答,但我还没有排除它,因为也许有人仍然可以告诉我们一些我们没想到的新东西
      • @TalKanel 感谢您的支持。我同意我们应该等待更积极的答案。
      【解决方案4】:

      您无法查询 AlarmManager 以获得您需要执行的命令列表。

      找到警报列表的最接近方法是使用dumpsys adb shell dumpsys alarm,但显然你不能在代码中这样做。

      【讨论】:

        【解决方案5】:

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

        开机时间截图:

        更新:LogCat 使用默认系统时钟设置晚上 9:56 的闹钟

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

        This might be of interest as well

        【讨论】:

        • 感谢您的回答。我投了赞成票,但老实说,我不确定连续嗅探 logcat 消息是否是个好主意。我的进程将一直处于活动状态,并消耗大量资源,最终会快速耗尽电池..即使我会忽略这个问题 - 仍然存在一些问题:com.android.desklock 在手机上不存在不适用于香草 android 固件,因此它不起作用..
        • 您的问题引起了好奇心,也许我们可以使用广播比处理程序更好地嗅探,如果我发现任何有价值或相关的信息,我会寻找更多细节并将其发布在这里.谢谢:)
        • 你不能再嗅探其他应用的logcat了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 1970-01-01
        相关资源
        最近更新 更多