『文件下载』
最终成品文件可扫码下载,在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的PowerOffAlarm
和DCAlarmHelper
触发更新,因此需要授予“访问所有设备日志”权限。
『效果图』
与预期一致。
『附: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`
}