Android获取活动警报列表
在我们的应用程序中,有没有办法通过编程方式获取android设备中所有活动警报的列表Android获取活动警报列表,android,alarm,Android,Alarm,在我们的应用程序中,有没有办法通过编程方式获取android设备中所有活动警报的列表 通过编程。只需给我指出一些有帮助的链接,我基本上是想让用户能够查看设备中的所有报警,所以我想获得设备中所有活动报警的列表。简短回答:你不能 报警管理器不显示系统中当前计划的报警。每个使用alarm manager的应用程序都必须保持其设置的每个报警的状态 但是,您可以通过adb获得此问题中所述的列表。应用程序可以通过这种方式获取系统转储和警报,但这需要根用户。不,抱歉,你不能通过编程实现,因此在UI中向用户显示
通过编程。只需给我指出一些有帮助的链接,我基本上是想让用户能够查看设备中的所有报警,所以我想获得设备中所有活动报警的列表。简短回答:你不能 报警管理器不显示系统中当前计划的报警。每个使用alarm manager的应用程序都必须保持其设置的每个报警的状态
但是,您可以通过adb获得此问题中所述的列表。应用程序可以通过这种方式获取系统转储和警报,但这需要根用户。不,抱歉,你不能通过编程实现,因此在UI中向用户显示该信息是不可行的 但是,为了供您自己参考,您可以通过以下方式转储报警数据:
adb shell dumpsys alarm
你不需要root权限
但你从上面得到的可能会让人很困惑。为了完全理解转储,您应该查看morphatic的答案。如果您指的是活动警报,即设备闹钟应用程序中的警报,我认为您可以。尝试从中检查方法 但是,如果您的意思是希望在设备上查看AlarmManager创建的所有报警,那么很遗憾,您无法通过编程方式执行此操作 但是,您可以在如下文本文件中查看转储数据:
adb shell dumpsys alarm > dump.txt
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
您可以获得计划的下一个警报 返回警报将触发的时间。此值是UTC挂钟时间(以毫秒为单位)
对于获取活动警报,目前还没有解决方法,但要获取警报列表,请使用,它可以访问警报铃声、铃声和通知声音 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);
}
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);
}
}
要获取用户从ActivityResult上选择使用的警报,请执行以下操作:
@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。如果您想通过编程方式获取音调列表,请使用:
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);
}
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);
}
}
我的新手机遇到了这个问题。我从一部旧手机迁移了数据,事后看来,我认为发生的是一个不活动的报警应用突然激活,或者迁移后该应用中的一个禁用报警被启用。不管怎么说,发生的事情是,每天8:30,一个我无法识别的警报突然响起 下面概述了我是如何解决这个问题的。如果你不在乎,滚动到TL;最后是博士 故障排除过程 我使用的过程是使用其他答案中描述的
adb
。然而,如果你这样做,你很快就会不知所措。对我来说,输出是一个2000多行的输出,在第260行的某个地方有一条简洁的信息:
Pending alarm batches: 130
这是因为这些不是你我所说的警报。相反,它们是要求在特定时间被唤醒的各种应用程序(例如,要求在一分钟内被唤醒以检查新邮件的邮件应用程序)。所以我猜是警报,但应用程序除外。我所做的是首先确定一个“合适的”警报是什么样子的。我已经在官方警报应用程序中启用了两个警报,并且它们在过去24小时内已经响起。所以我首先跑:
adb shell dumpsys alarm > two-alarms.txt
然后我禁用了两个警报中的一个并运行:
adb shell dumpsys alarm > one-alarm.txt
然后,我比较了这两个输出,发现大部分差异都与时间戳有关(这很有意义——它们在不同的时间运行,并且输出主要集中在“从现在起X毫秒我应该做什么”)。例如,我会看到diff
这样的输出:
adb shell dumpsys alarm > dump.txt
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
这仍然包含大量噪音,但相关部分更容易定位。例如,我发现的第一个重大差异是:
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}:
在这里,我们可以看到,该应用程序在一天、10小时37分、几秒和几毫秒前发出了大量警报(-1d10h37m18s647ms
)。这是有道理的。该输出在18:32(下午6:32)运行,我的一个真实警报设置在7:55。认识到我们如何识别“最后一次触发”的时间,我们现在可以搜索那个虚幻的8:30警报。8:30距离报告时间大约一天10小时2分钟,因此我们搜索-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
?快速搜索将在中显示结果。瞧!我让莫尼菲安装了那个警报器。我完全忘记了我曾经测试过这个应用程序,在我决定它不适合我之后,我忘记了删除它。问题解决了
TL;博士
步骤1:
运行报警输出:
adb shell dumpsys alarm > my-alarms.txt
步骤2:
计算从现在到最后一次虚幻警报运行的相对时间。例如,如果运行输出的时间是下午6:32:18,并且警报在昨天早上7点发出,则差值为下午6:32-7点+24小时,或1天11小时32分钟18秒(这里可以方便地使用电子表格计算时间)
步骤3:
将时差重新格式化为-DdHhMm
,其中D
是天数,H
是小时数,M
是分钟数。为了避免时钟漂移的问题,我们将忽略秒数。在前面的示例中,这将是-1d11h32m
步骤4:
在步骤1的输出中搜索此字符串。如果找不到,可以在字符串中减去或加上一分钟,以纠正时钟差异。但有些应用程序可以设置/更新活动报警。应用程序可以通过维护活动警报列表来设置/修改自己的警报。该列表将使用SharedReferences或sqlite持久化。要修改或删除报警,请完全按照设置报警对象时的状态重新创建报警对象,并使用AlarmManager方法。干杯。我所说的活动闹钟是指安卓“时钟”应用程序中创建的闹钟。我们能进入那些警报吗?好的,我想你在找这个: