用摩斯密码「听」时间:一款安卓报时应用的诞生

你是否想过,时间可以用摩斯密码来「听」?

在智能设备无处不在的今天,我们习惯了通过屏幕看时间。但对于视障朋友,或者在光线不足的环境下,一款能够用振动、声音甚至闪光灯来播报时间的应用,或许会带来意想不到的便利。基于这个想法,我开发了一款名为「Morse Code Time」的安卓应用,它能够将当前时间编码为摩斯密码,通过你选择的方式播报出来。

https://github.com/zd200572/morsecode-tmier-android

功能亮点

这款应用的核心功能,是把时间转换成摩斯密码后,通过三种方式输出:振动、声音和闪光灯。你可以在开会时只开振动,在黑暗环境中使用闪光灯,或者干脆三种方式一起用------完全由你决定。

除了手动播报,应用还支持定时播报功能。你可以设置每15分钟、30分钟或60分钟自动报时,就像传统的整点报时一样。不同的是,这次报的是摩斯密码。

考虑到实际使用场景,我还加了一个设置选项:是否播报日期。默认情况下,应用只播报时间,保持简洁。但如果你需要完整的时间信息,也可以开启日期播报。

技术实现

摩斯密码编码

要把时间变成摩斯密码,首先要解决编码问题。摩斯密码用「点」和「划」来表示数字,比如数字「2」就是「··−−−」,两个短信号接三个长信号。

在应用中,我定义了标准的时长参数。短信号持续200毫秒,长信号持续600毫秒,正好是短信号的三倍。信号之间有200毫秒的间隔,两个数字之间间隔600毫秒,而小时和分钟之间则用1200毫秒分隔。这个节奏经过反复调试,既能保证清晰辨识,又不会太慢让人着急。

时间编码的逻辑很简单。比如现在是22点49分,应用会把「2」「2」「4」「9」四个数字分别转换成摩斯码,然后用空格分隔显示。代码实现上,用一个简单的映射表就能完成数字到摩斯码的转换。

多通道信号输出

如何把编码变成实际的信号输出?这就涉及到安卓系统的几个底层接口了。

振动输出使用的是系统 Vibrator API。安卓12之后,获取振动器的方式有所变化,需要通过 VibratorManager 来获取。为了兼容不同版本,代码中做了条件判断。振动时使用 VibrationEffect 创建单次振动效果,时长就是信号持续时间。

声音输出稍微复杂一些。我使用 AudioTrack 来生成800赫兹的正弦波蜂鸣音。为什么不直接播放音频文件?因为信号的时长是动态变化的,实时生成更灵活。代码中会根据信号时长计算需要的采样点数量,然后生成对应的正弦波数据。为了避免开关时的「爆破音」,我还加了淡入淡出处理,让声音的起止更加平滑。

闪光灯的控制则使用 Camera2 API 的 Torch 模式。通过 CameraManager 获取摄像头ID,然后调用 setTorchMode 方法控制开关。需要注意的是,并非所有设备都有闪光灯,所以代码中做了可用性检测,不支持时自动禁用这个选项。

协程驱动的信号播放

三种输出方式需要同步进行,这就需要一个好的调度机制。我使用 Kotlin 协程来实现信号序列的播放。

SignalPlayer 是整个播放逻辑的核心。它接收摩斯编码引擎生成的信号序列,然后用协程按顺序播放。每个信号要么是「开」,要么是「关」,播放时会根据信号类型调用相应的输出模块。

有趣的是进度回调的设计。播放时,UI需要知道当前播放到哪个信号,以便高亮显示对应的摩斯码符号。我在 SignalPlayer 中设置了 onProgress 回调,每播放一个「开」信号就通知UI更新。这样,用户就能看到摩斯码逐个亮起的效果。

定时播报服务

定时播报功能通过前台服务实现。使用 AlarmManager 的 setExactAndAllowWhileIdle 方法设置精确闹钟,即使设备处于休眠状态也能准时触发。

这里有个细节值得一提。前台服务需要显示一个常驻通知,让用户知道服务正在运行。通知内容会显示当前的播报间隔,比如「每30分钟自动播报」。点击通知可以回到应用主界面。

还有一点是开机自启。通过注册 RECEIVE_BOOT_COMPLETED 广播,设备重启后应用会自动检查定时播报是否开启,如果是就重新启动服务。这样用户设置就不会因为重启而失效。

UI 设计

界面采用 Material 3 设计语言,深色主题搭配琥珀金色作为强调色。这种配色既有科技感,又不会太刺眼,适合在各种环境下使用。

主界面从上到下依次是:大号时间显示、摩斯码文本、可视化符号区、输出开关、定时播报设置、播报按钮。时间显示区域加了呼吸光晕动画,让界面更加生动。

摩斯码的可视化显示是UI的一个亮点。我用圆点表示短信号,用短横线表示长信号,播放时当前信号会高亮显示。这种直观的视觉反馈,帮助用户更好地理解正在播放的内容。

实用技巧

如果你想学习摩斯密码,这款应用其实是个不错的练习工具。打开声音和可视化显示,对照着看听,很快就能熟悉数字的编码规律。

对于视障用户,可以只开启振动和声音,不依赖屏幕就能获取时间信息。在嘈杂环境中,振动模式的可靠性更高。

定时播报功能可以当作独特的「时钟」使用。设置好间隔后,即使不看手机,也能通过振动或声音知道大致时间。这对需要专注工作但又想保持时间感的场景特别有用。

技术栈总结

项目使用 Kotlin 语言开发,UI 基于 Jetpack Compose 构建,采用 MVVM 架构。异步处理使用 Kotlin 协程,数据持久化使用 SharedPreferences。最低支持 Android 8.0(API 26)。

整个项目是开源的,代码托管在 GitHub 上,采用 MIT 协议。如果你对实现细节感兴趣,或者想要二次开发,欢迎查看源码。

写在最后

开发这款应用的初衷,是想探索一种不同的时间感知方式。我们习惯了视觉获取信息,但听觉和触觉同样重要。摩斯密码作为一种经典编码方式,把时间变成了有节奏的信号,这个过程本身就很有趣。

如果你觉得这个想法有意思,不妨试试看。或许在某个黑暗的夜晚,或是需要安静的时刻,它会成为一个特别的存在。

相关推荐
不会写代码的猴子2 小时前
Android17版本更新预览
android·android studio
用户41659673693553 小时前
记一次深坑:RecyclerView + FlexboxLayoutManager 导致 canScrollVertically 误判的剖析与修复
android
Be for thing4 小时前
Android 音频硬件(Codec / 喇叭 / 麦克风)原理 + 功耗与问题定位实战(手机 / 手表通用)
android·学习·智能手机·音视频
吉哥机顶盒刷机4 小时前
S905L3A/L3AB芯片迎来安卓14新纪元:Sicha移植版固件深度评测与刷机指南
android·经验分享·刷机
一个天蝎座 白勺 程序猿4 小时前
KingbaseES数据库MySQL兼容性解析:从TCO账本到“傻瓜式“迁移的密码
android·数据库·mysql·kingbasees
Be for thing4 小时前
Android 存储硬件(RAM/UFS/eMMC)底层原理 + 性能 / 功耗测试实战
android·学习·智能硬件
码农的小菜园4 小时前
Android架构学习笔记
android·学习·架构
风酥糖4 小时前
在Termux中运行Siyuan笔记服务
android·linux·服务器·笔记