阅读提示
如果您不想阅读原理部分,只需要在自己的手机上使用,您可以跳转到文末“完整操作步骤”。
环境
本文测试手机环境:
HyperOS 1.0.6.0 (Android 14)
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
。
所以接下来的思路就很简单了。
值得一提的是,Hyper OS中需要logcat entry的PowerOffAlarm
和DCAlarmHelper
触发更新,因此需要授予“访问所有设备日志”权限。
但是每次都需要通过对话框授予权限,有点麻烦,因此也考虑,在解锁屏幕和返回桌面时触发小部件更新。
效果图
与预期一致。
附:Tasker JSlet代码
let pattern = new RegExp(alarm_tag+`\\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`
}
完整操作步骤
手机开启ADB调试,执行以下命令(授予权限):
adb shell pm grant net.dinglisch.android.taskerm android.permission.WRITE_SECURE_SETTINGS adb shell pm grant net.dinglisch.android.taskerm android.permission.READ_LOGS adb shell pm grant net.dinglisch.android.taskerm android.permission.DUMP adb shell pm grant net.dinglisch.android.taskerm android.permission.PACKAGE_USAGE_STATS
若控制台报错,请先自行解决。若控制台无输出,则说明执行成功,请继续完成下列步骤。
导入Tasker项目
首先将文件移动到
根目录/Tasker/projects
。然后在Tasker首页 - 长按底部 - “导入项目”。
获取并输入“闹钟唯一标识符
alarm_tag
”不同品牌的闹钟唯一标识符不同。请先获取属于你的唯一标识符:
原生Android / 华为
请放弃阅读这篇文章,因为你的设备本身就支持直接使用原生api(
$si(alarmd)$
)获取闹钟信息。小米 / 三星
系统 唯一标识符 HyperOS com.android.deskclock.ALARM_ALERT
One UI
(感谢@光阴以南年华以北)com.samsung.sec.android.clockpackage.alarm.EXPLICIT_ALARM_ALERT
其他品牌
找到唯一标识符的方法很简单:
- 设定一个闹钟(如明天的09:14)
- 运行
adb shell dumpsys alarm
,复制所有输出到文本编辑器中 - 在文本编辑器内查找(Ctrl+F)对应的时间文本(如上图
origWhen=2023-07-05 09:14:00
) - 前面
com.
开头的字符串就是唯一标识符!
同时期待你在评论区贡献你使用品牌手机的唯一标识符!
然后在Tasker中输入你找到的标识符:Tasker首页 - 长按底部项目名/图标 - “属性” - “项目变量” -
%alarm_tag
的“值” - 输入你的标识符导入KWGT组件
文件下载
首先将KWGT组件文件移动到
根目录/Kustom/komponents
。然后,按照常规方法进入KWGT组件编辑界面,右上角“+”,“组件”,底下菜单栏“库”,选择“闹钟with adb shell”。
桌面查看小组件,成功!
发表您的看法