Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android获取活动警报列表_Android_Alarm - Fatal编程技术网

Android获取活动警报列表

Android获取活动警报列表,android,alarm,Android,Alarm,在我们的应用程序中,有没有办法通过编程方式获取android设备中所有活动警报的列表 通过编程。只需给我指出一些有帮助的链接,我基本上是想让用户能够查看设备中的所有报警,所以我想获得设备中所有活动报警的列表。简短回答:你不能 报警管理器不显示系统中当前计划的报警。每个使用alarm manager的应用程序都必须保持其设置的每个报警的状态 但是,您可以通过adb获得此问题中所述的列表。应用程序可以通过这种方式获取系统转储和警报,但这需要根用户。不,抱歉,你不能通过编程实现,因此在UI中向用户显示

在我们的应用程序中,有没有办法通过编程方式获取android设备中所有活动警报的列表
通过编程。只需给我指出一些有帮助的链接,我基本上是想让用户能够查看设备中的所有报警,所以我想获得设备中所有活动报警的列表。

简短回答:你不能

报警管理器不显示系统中当前计划的报警。每个使用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方法。干杯。我所说的活动闹钟是指安卓“时钟”应用程序中创建的闹钟。我们能进入那些警报吗?好的,我想你在找这个: