『文件下载』

最终成品文件可扫码下载,在Tasker和KWGT中导入。

 

『环境』

本文测试手机环境:

MIUI 14.0.16.0 (Android 13)

Tasker 6.1.32

Kustom Widget 3.73b

『问题背景』

在KWGT(Kustom)上使用官方给的$si(alarmd)$在原生安卓上可行,但在国产安卓上会获取错误的下一闹钟时间信息。

我还想过用Tasker自带的“测试下一闹钟”%na_time获取时间,然后通过广播发送给KWGT。但Tasker同样无法在国产安卓上获取正确的时间。

 

那怎么办呢?

『问题原因』

原因其实很简单,就是KWGT调用安卓系统的api获取alarm信息,而这个alarm未必是由闹钟应用创建的,也有可能是其他应用为了在某一时间唤醒自身功能创建的。例如,系统桌面会创建闹钟,以在设定时间开启/关闭深色模式;滴答清单会创建闹钟,以在设定时间推送待办消息。

此外,笔者所用的MIUI以魔改安卓系统而闻名,这进一步加大了获取准确闹钟时间的难度。

『解决方案』

ADB Shell命令adb shell dumpsys alarm 可以获取所有应用创建的闹钟列表,而我们想要的闹铃信息在列表中有唯一的标识符com.android.deskclock.ALARM_ALERT

所以思路就很简单了。

值得一提的是,MIUI中需要logcat entry的PowerOffAlarmDCAlarmHelper触发更新,因此需要授予“访问所有设备日志”权限。

『效果图』

与预期一致。

 

『附:Tasker JSlet代码』

let pattern = /com.android.deskclock.ALARM_ALERT\n +type=RTC_WAKEUP origWhen=([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2})/;

var alarmon = pattern.test(shell_text);
if (alarmon){
    let date_time_array=shell_text.match(pattern);
    var alarmd=`${date_time_array[1]}y${date_time_array[2]}M${date_time_array[3]}d${date_time_array[4]}h${date_time_array[5]}m`
}