拒绝“数字抛弃”!我用 Kotlin + 无障碍服务写了个极致极简 Android 桌面,让爷爷也能一键视频通话

137 阅读5分钟

项目地址github.com/su-Insight/…

关键词:Android, Kotlin, AccessibilityService, 适老化改造, 开源

🥺 引言:被困在智能手机里的长辈

春节回家,你是否经历过这样的无奈时刻?

家里的长辈拿着手机,一脸茫然地问你:“我也想看看孙子,这个微信视频怎么打不开了?”、“手机怎么又被扣费了?”、“这个图标去哪了?”。

对于我们而言,滑动、点击、搜索是肌肉记忆;但对于视力减退、认知能力下降的老年人来说,现代 Android 系统的层级菜单、无孔不入的广告推送、复杂的交互逻辑,就像一道道难以逾越的“数字鸿沟”。

科技不应成为长辈的门槛,而应是连接亲情的桥梁。

市面上的“老人模式”往往只是把字体调大,并没有解决交互复杂的根本问题。于是,作为一名 Android 开发者,我决定自己动手,做一款真正懂长辈的启动器——MoreTalk(墨谈)


📱 效果展示:极致的减法

先看东西。这不是一个功能堆砌的 App,而是一个在做“极致减法”的产品。

***

🛠️ 产品哲学:不仅是 UI,更是自动化

MoreTalk 的核心逻辑只有三点:防误触一键直达无感辅助

1. 为什么要做“一键视频”?

常规的微信视频流程:打开微信 -> 找到联系人列表 -> 搜索/翻找 -> 点击头像 -> 点击+号 -> 点击视频通话。 这 6 步,任何一步出错(比如点到了朋友圈广告),长辈就会迷路。

MoreTalk 的解决方案: 利用 Android 的 AccessibilityService(无障碍服务),我将这套复杂的交互封装成了“宏指令”。 长辈在桌面点击“儿子的视频”,App 会自动唤起微信,自动寻找对应联系人,自动点击视频按钮。把 6 步变成 1 步。

2. 为什么要砍掉“扫一扫”和“付款码”?

很多老人机桌面集成了这些功能,但我选择移除。 长辈对网络诈骗缺乏辨识能力,误扫二维码导致扣费的案例比比皆是。保护长辈的最好方式,就是物理隔离高风险入口。

3. “被动式”的信息获取

现在的天气 App 广告满天飞。MoreTalk 内置了静默定位逻辑,利用 FusedLocationProvider 获取位置,结合 TTS(TextToSpeech)技术。 不需要长辈去看、去刷新,整点或者点击时,手机会直接“告诉”长辈:“今天多云,气温 20 度,有点冷记得加衣。”


🧑‍💻 技术干货:我是怎么实现的?

虽然界面简单,但为了保证稳定性和流畅度,我在技术选型上并没有妥协,全面拥抱了 Modern Android Development。

1. 核心引擎:AccessibilityService 实战

这是项目的灵魂。为了实现自动化点击,我们需要监听窗口状态并模拟操作。

  • 节点查找:通过 rootInActiveWindow.findAccessibilityNodeInfosByText() 精准定位微信 UI 树中的关键元素(如“发消息”、“视频通话”按钮)。
  • 模拟手势:使用 performAction(AccessibilityNodeInfo.ACTION_CLICK) 模拟点击。
  • 容错处理:微信版本更新频繁,我在 service/WechatAccessibilityService.kt 中做了大量的适配逻辑,确保在不同分辨率和微信版本下都能准确命中目标。

2. 架构模式:MVVM + Clean Architecture

拒绝“面条代码”。即使是小项目,清晰的架构也方便后续维护(毕竟我要维护到我爸妈用上)。

  • Repository 层:统一管理天气 API 数据、定位数据和本地 Room 数据库(联系人存储)。
  • ViewModel 层:利用 StateFlow 管理 UI 状态,确保界面与数据单向流动。

3. 异步处理:Kotlin Coroutines + Flow

在处理天气请求和定位时,全程使用协程。

// 伪代码示例:响应式天气获取
fun fetchWeather() = flow {
    emit(Resource.Loading)
    val location = locationClient.awaitLastLocation()
    val weather = api.getWeather(location.latitude, location.longitude)
    emit(Resource.Success(weather))
}.catch { e ->
    emit(Resource.Error(e))
}.stateIn(viewModelScope)

4. 依赖管理与兼容性

  • Minimum SDK 24 (Android 7.0):为了覆盖大多数老旧闲置手机。
  • Material Design:虽然是极简风,但配色和触控反馈依然遵循 Material 规范,视觉舒适。

🚀 部署指南(给开发者子女们)

这个项目目前需要你(子女/开发者)作为“系统管理员”进行初次配置。

第一步:获取源码与编译(或直接从GitHub中下载构件) 环境要求:Android Studio Jellyfish+ / Java 11 / Kotlin 1.9

git clone [https://github.com/su-Insight/MoreTalk.git](https://github.com/su-Insight/MoreTalk.git)
cd MoreTalk
# 等待 Gradle Sync 完成,连接真机 Run 'app'

(注:无障碍服务强烈建议在真机环境调试,模拟器可能会有各种奇怪的 Bug)

第二步:关键的“适老化”配置 (⚠️重要) 安装好后,请务必帮长辈做好以下设置,这是一劳永逸的关键:

  1. 锁定桌面:设置 -> 应用 -> 默认应用 -> 桌面 -> 选择 MoreTalk。(防止长辈按 Home 键回到原来的复杂桌面)
  2. 开启“外挂”:设置 -> 无障碍 -> 已安装的服务 -> 开启 MoreTalk 智能辅助。(这是自动化点击的核心权限)
  3. 精准匹配:在 App 内添加联系人时,备注名必须和微信里的备注一字不差。(例如微信备注是“大儿子”,App 里也要填“大儿子”,否则辅助服务找不到节点)
  4. 防杀后台:将 App 设为电池优化白名单,并锁定后台,确保天气播报不被系统杀掉。

❤️ 开源寄语

MoreTalk 目前已经发布了 v1.0.0 版本,能够满足基础的通讯和生活需求。

但我个人的力量是有限的。不同的机型、不同的微信版本、不同的生活场景,都可能存在我没考虑到的 Bug 或需求。

如果你也是 Android 开发者,如果你家里也有从不离手却不会用手机的长辈,欢迎 Star,更欢迎 PR!

让我们用代码,填平这道数字鸿沟。

👉 GitHub 地址github.com/su-Insight/…