背景图
KWGT获取“下一闹钟”正确时间

阅读提示

如果您不想阅读原理部分,只需要在自己的手机上使用,您可以跳转到文末“完整操作步骤”。

环境

本文测试手机环境:

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

adb输出 (部分)

所以接下来的思路就很简单了。

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

但是每次都需要通过对话框授予权限,有点麻烦,因此也考虑,在解锁屏幕和返回桌面时触发小部件更新。

效果图

与预期一致。

附: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`
}

完整操作步骤

  1. 手机开启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

    若控制台报错,请先自行解决。若控制台无输出,则说明执行成功,请继续完成下列步骤。

    adb授权成功
  2. 导入Tasker项目

    文件下载

    直接下载Tasker项目文件
    或直接在TaskerNet中下载:Tasker Share (taskernet.com)

    首先将文件移动到根目录/Tasker/projects

    然后在Tasker首页 - 长按底部 - “导入项目”。

  3. 获取并输入“闹钟唯一标识符alarm_tag

    不同品牌的闹钟唯一标识符不同。请先获取属于你的唯一标识符:

    原生Android / 华为

    请放弃阅读这篇文章,因为你的设备本身就支持直接使用原生api($si(alarmd)$)获取闹钟信息。

    小米 / 三星

    系统唯一标识符
    HyperOScom.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的“值” - 输入你的标识符

    输入alarm_tag

  4. 导入KWGT组件

    首先将KWGT组件文件移动到根目录/Kustom/komponents

    然后,按照常规方法进入KWGT组件编辑界面,右上角“+”,“组件”,底下菜单栏“库”,选择“闹钟with adb shell”。

  5. 桌面查看小组件,成功!


发表您的看法

加载失败,请刷新页面。若该问题持续出现,则可能是评论区被禁用。