Android获取活动警报列表

时间:2014-02-22 04:08:31

标签: android alarm

有没有办法在我们的应用程序中以编程方式获取Android设备中所有活动警报的列表 以编程方式。只需指出一些可以提供帮助的链接我基本上试图让用户查看设备中所有警报的工具,这样我就可以获得设备中所有活动警报的列表。

6 个答案:

答案 0 :(得分:17)

不,AFAIK您无法以编程方式执行此操作,因此在UI中向用户显示该信息是不可行的。

但是为了您自己的参考,您可以通过

转储警报数据
adb shell dumpsys alarm

您不需要root权限。

但是你从上面得到的东西可能会让人很难理解。为了完全理解转储,你应该查看morphatic的回答here

答案 1 :(得分:15)

简短回答:你不能。

警报管理器无法查看当前在系统中安排的警报。每个使用警报管理器的应用程序都必须保持其设置的每个警报的状态。

但是,您可以按照此问题Get list of active PendingIntents in AlarmManager中的说明通过adb获取列表。并且应用程序可以获取系统转储并以此方式获取警报,但这需要root。

答案 2 :(得分:8)

如果您的意思是活动闹钟,那么设备的闹钟应用程序中的那些,我认为您可以。尝试查看Here中的方法。

但是,如果您想要查看设备上由AlarmManager创建的所有警报,那么很遗憾您无法以编程方式执行此操作。

但是,您可以在文本文件中查看转储数据,如下所示:

adb shell dumpsys alarm > dump.txt

答案 3 :(得分:0)

您可以获得排定(docs)的下一个警报

getSystemService(AlarmManager::class.java).nextAlarmClock.triggerTime
  

返回警报触发时间。该值是UTC挂钟时间(以毫秒为单位)

答案 4 :(得分:0)

要获取活动警报,尚无解决方法,但要获取警报列表,请使用RingtoneManager,它可以访问警报音,铃声和通知声音。

1。要启动用户选择警报的默认意图,您可以像这样启动隐式意图:

private void selectAlarmTone(){
    Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALARM); //Incase you want the user to set a notification use => RingtoneManager.TYPE_NOTIFICATION, ringtone use => RingtoneManager.TYPE_RINGTONE
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select an alarm tone");
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri) null);
    startActivityForResult(intent, 1);
}

并获得用户已从onActivityResult中选择使用的警报:

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final
Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && requestCode == 1) {
        Uri selectedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);

        Ringtone ringtone = RingtoneManager.getRingtone(this, selectedUri);
        String title = ringtone.getTitle(this);
        Log.i("ALARM_SELECTED: ", title);
    }
}

2。如果您想以编程方式获取音调列表,请使用:

public void listAlarmtones() {
    RingtoneManager ringtoneManager = new RingtoneManager(this);
    ringtoneManager.setType(RingtoneManager.TYPE_ALARM);
    Cursor cursor = ringtoneManager.getCursor();

      while (cursor.moveToNext()) {
        String title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);
        String uri = String.valueOf(ringtoneManager.getRingtoneUri(cursor.getPosition()));

        String alarmTone = cursor.getString(cursor.getColumnIndex("title"));

        Log.e("ALARM_TONE: ", title + "=>" + uri + "=>" + alarmTone);
      }
}

答案 5 :(得分:0)

我刚用新手机碰到这个问题。我从较旧的手机迁移了数据,事后看来,我认为发生的事情是突然激活了一个不活动的警报应用程序,或者在迁移后启用了该应用程序中的禁用警报。无论如何,每天晚上8:30突然响起我无法识别的警报。

以下概述了我如何解决它。如果您不在乎,请滚动到末尾的TL; DR。

故障排除过程

我使用的过程是使用adb,如其他答案所述。但是,如果这样做,您很快就会不知所措。对我来说,输出是2,000行以上的输出,其中包含260条左右的简洁消息:

Pending alarm batches: 130

这是因为这些不是您和我所说的警报。相反,它们是要求在特定时间唤醒的各种应用程序(例如,要求在一分钟内唤醒以检查新邮件的邮件应用程序)。所以我猜是警报,但对于应用程序。我要做的是首先确定“正确”警报的外观。我已经在启用的官方警报应用程序中有两个警报,它们在过去的24小时内响了。所以我先跑了:

adb shell dumpsys alarm > two-alarms.txt

然后我禁用了两个警报之一并运行:

adb shell dumpsys alarm > one-alarm.txt

然后,我比较了两个输出,并注意到大多数差异与时间戳有关(这很有意义-它们在不同的时间运行,并且输出集中在“我应该从现在开始X毫秒后做什么”上) )。例如,我会看到diff这样的输出:

287c293
<       type=3 expectedWhenElapsed=+1m51s619ms expectedMaxWhenElapsed=+1m51s619ms whenElapsed=+1m51s619ms maxWhenElapsed=+1m51s619ms when=+1m51s619ms
---
>       type=3 expectedWhenElapsed=+1m48s727ms expectedMaxWhenElapsed=+1m48s727ms whenElapsed=+1m48s727ms maxWhenElapsed=+1m48s727ms when=+1m48s727ms

我重新运行了差异,过滤出包含type=的行:

$ diff -I 'type=' two-alarms.txt one-alarm.txt|less

它仍然包含很多噪音,但是相关部分更容易找到。例如,我发现的第一个实质区别是:

561c567,573
< Batch{b03e994 num=1 start=1851593838 end=1851593838 flgs=0x1}:
---
> Batch{849c837 num=1 start=1851593838 end=1851593838 flgs=0x5}:
>     RTC_WAKEUP #0: Alarm{e855db5 statsTag *walarm*:com.google.android.gms.reminders.notification.ACTION_REFRESH_TIME_REMINDERS type 0 when 1606626000000 com.google.android.gms}
>       tag=*walarm*:com.google.android.gms.reminders.notification.ACTION_REFRESH_TIME_REMINDERS
>       type=0 expectedWhenElapsed=+4h30m42s565ms expectedMaxWhenElapsed=+4h30m42s565ms whenElapsed=+4h30m42s565ms maxWhenElapsed=+4h30m42s565ms when=2020-11-29 00:00:00.000
>       window=0 repeatInterval=0 count=0 flags=0x5
>       operation=PendingIntent{543c4a: PendingIntentRecord{97867bb com.google.android.gms startService}}
> Batch{3f531a4 num=1 start=1851593838 end=1851593838 flgs=0x1}:

这显然是我设置的提醒(或者可能是Google提醒设置了“提醒我检查提醒”的通用警报)。

在输出中进行更多的挖掘可以得到:

1027c1033,1039
<       type=0 expectedWhenElapsed=+1d13h20m45s459ms expectedMaxWhenElapsed=+1d13h20m45s459ms whenElapsed=+1d13h20m45s459ms maxWhenElapsed=+1d13h20m45s459ms when=2020-11-30 08:50:00.002
---
>       type=0 expectedWhenElapsed=+1d13h20m42s566ms expectedMaxWhenElapsed=+1d13h20m42s566ms whenElapsed=+1d13h20m42s566ms maxWhenElapsed=+1d13h20m42s566ms when=2020-11-30 08:50:00.002
>       window=0 repeatInterval=0 count=0 flags=0x9
>       operation=PendingIntent{89757d2: PendingIntentRecord{127f2fd com.lge.clock broadcastIntent}}
> Batch{39e90a3 num=1 start=2045693838 end=2045693838 flgs=0x9}:
>     RTC_WAKEUP #0: Alarm{ba76fa0 statsTag *walarm*:com.lge.clock.show_quick_dismiss_noti type 0 when 1606820100000 com.lge.clock}
>       tag=*walarm*:com.lge.clock.show_quick_dismiss_noti
>       type=0 expectedWhenElapsed=+2d10h25m42s565ms expectedMaxWhenElapsed=+2d10h25m42s565ms whenElapsed=+2d10h25m42s565ms maxWhenElapsed=+2d10h25m42s565ms when=2020-12-01 05:55:00.000

因此,官方闹钟应用似乎是com.lge.clock,这很合理-它是LG手机。让我们在原始输出中查找它:

  u0a194:com.lge.clock +21s656ms running, 61 wakeups:
    +12s50ms 11 wakes 11 alarms, last -1d10h37m18s647ms:
      *walarm*:com.lge.clock.alarmclock.internal.for.lmk
    +8s338ms 17 wakes 17 alarms, last -1d12h42m26s219ms:
      *walarm*:com.lge.clock.show_quick_dismiss_noti
    +4s272ms 11 wakes 11 alarms, last -1d10h37m18s647ms:
      *walarm*:com.lge.clock.alarmclock.internal
    +1s2ms 11 wakes 11 alarms, last -1d10h38m15s71ms:
      *walarm*:com.lge.sizechangable.weather.action.force.update.currentonly
    +996ms 11 wakes 11 alarms, last -1d10h37m18s647ms:
      *walarm*:indicator

在这里我们可以看到该应用在一天零十小时零三十七分钟以及几秒钟和几毫秒前(-1d10h37m18s647ms)发出了许多警报。这很有道理。此输出在18:32(6:32 pm)运行,我的真实警报之一设置为7:55。认识到我们如何确定“最后触发”的时间,我们现在可以搜索该虚幻的8:30警报。 8:30距报告时间大约一天零十小时零两分钟,因此我们搜索-1d10h2m并得到:

  u0a235:net.fredericosilva.mornify +14s944ms running, 20 wakeups:
    +14s944ms 20 wakes 20 alarms, last -1d10h2m26s3ms:
      *walarm*:net.fredericosilva.mornify/.alarm.AlarmBroadcastReceiver

嗯... net.fredericosilva.mornify是什么?快速搜索会显示Mornify Play Page。瞧!我安装了该警报的Mornify。我完全忘记了我过去曾经测试过该应用程序,并在我决定对它不起作用后忘记删除它。问题解决了!

TL; DR

步骤1:

运行警报输出:

adb shell dumpsys alarm > my-alarms.txt

步骤2:

弄清从现在到上一次虚假警报运行的相对时间。例如,如果运行输出的时间是6:32:18 pm,并且警报是在早晨早上7点发出,则时差是6:32 pm-7am+24小时,即1天,11小时,32分钟和18秒(电子表格可以为您方便地计算时间)。

步骤3:

将时差重新格式化为-DdHhMm,其中D是天数,H是小时数,M是分钟数。为了避免时钟漂移问题,我们将在此处忽略几秒钟。在我们之前的示例中,该名称为-1d11h32m

步骤4:

在步骤1的输出中搜索该字符串。如果找不到,请在字符串中减去两个或加一分钟以纠正时钟差异。