我在杭州的家里放着一个柯达电子相框,平时用 U 盘把照片拷进去,插上电,屏幕就会一张张翻过去。上次父母来我家,看到它,觉得不错,也希望有一个。对我来说,挑图、拷贝、插拔 U 盘都还顺手,可要让父母以后自己更新,就太折腾了。我和他们隔着一千公里,总不能每多拍一些照片,就等下一次回家,再带着 U 盘去换。于是,9 月 29 日,我开始认真考虑给父母准备一个能远程更新的相框。

起初想的当然是买现成的。柯达也好,其他品牌也好,只要在我这边上传,父母那边就能看到,事情就算解决了。但看了一圈,总有些地方不合心意。大量照片怎么传、以后怎么管理,未必顺手;照片还要经过第三方云端,我也有些顾虑。那些都是自己和家人的生活,原本已经好好地放在 NAS 里,再交给另一个平台,总觉得多了一层不由自己掌握的关系。我开始想,既然照片在我这里,家里又有 NAS 和 DDNS,能不能把这条路自己接起来?我挑好照片,直接送到父母的相框上。往后想加一些、换一些,在自己的电脑上就能完成。想法到了这里,便慢慢从“买一个”变成了“做一个”。

最初,是真的想从硬件开始做。和 AI 讨论屏幕、主板、存储、供电,还想过加上 4G,免得父母连 Wi-Fi。屏幕最好大一点,他们六十多岁了,看起来舒服;照片存在本地,断了网也继续播;第一次先装好一大批,以后每次补几十张就够了。这些要求单独看都很朴素,放到一起,却把事情越推越远。一个 4G 模组,后面牵着频段、载板、电源和信号;选好了屏幕,还要考虑外壳、散热、装配。对于不熟悉硬件的我,每一个名词都意味着又一段需要补上的功课。

后来我想到,现成相框其实已经把这些事情做完了。屏幕、触摸、外壳和供电都在那里。如果它的底层是 Android,我能不能借用它的硬件,再用 AI 写一套自己的软件?这个转念让项目有了更现实的落脚点。可以先用已有的设备试一试,再看它能走多远。

国庆期间,软件先在电脑上跑了起来。那时还没有接上真正的相框,我们先做选图网页,再做发布、同步和播放器。9 月 30 日,基本流程已经能走通:从照片库里挑图,确认发布,另一端接收,存下来,再离线轮播。先用测试图片,随后接入真实 NAS。当熟悉的文件夹和照片出现在网页里,这件事才开始有了自己的样子。

我的 NAS 按自己的习惯整理着许多照片,但它们并不都需要传给父母。所以选图要单独做,选完还要有一次确认。这样,我可以慢慢挑,不用担心随手点一下,某张照片就立即出现在远处的屏幕上。误传了,也要能撤回来。我还希望新照片先播,最近几年的照片多出现一些,更早的照片也别一直沉在后面。翻看老照片和看到近况,给人的感受是不同的。一个相框里,应该容得下这两种时间。

这些念头说出来不过几句话,写成程序却需要考虑许多细节。照片传到一半断网了怎么办?程序退出以后,还记不记得已经收过哪些?我在网页上撤回了一张照片,它如果还停在屏幕上,能不能算撤回完成?开发时,我们就这样顺着一个个问题往下走。下载可以继续,状态需要保存,撤回要等照片真的退出屏幕后再确认。慢慢地,我也开始理解为什么一件看起来简单的小电器,背后会藏着那么多工作。它被放到一千公里之外以后,今天可以伸手点一下解决的小问题,就可能变成父母不知道该怎么办、我也看不到现场的麻烦。

10 月 6 日,我回到杭州,把相框接到了电脑上。设备型号是 RCF-1012W。先不动系统,让 AI 读取设备信息:Android 6.0.1,约 1 GB 内存,1280×800 的触摸屏。配置已经有些年头,但能连接调试,也有继续安装自有应用的条件。

于是,电脑里的原型开始往这台真实设备上搬。适配老版本 Android,生成 APK,先在模拟器上验证,再装到相框里。我们保留了原厂 Android,逐步用自己的应用接管播放。平时说“用 AI 刷软件”,实际就是这样一点点开发、安装、测试,并没有重刷整套系统。原先想要的 4G,也在这时放下了。这台设备没有这个能力,就先用 Wi-Fi。随着真实硬件接进来,方案里有些东西被留下,有些被舍弃,还有一些换了实现方式。最初设想的是一台什么都具备的新设备,后来做的,是让眼前这台设备尽可能合用。

装上应用以后,问题一下子变得具体了。原厂程序偶尔又回到了前台,重启以后还会让人选择用哪个应用;设置页看着不舒服,按钮和提示有时超出屏幕;打开系统 Wi-Fi 设置,却发现没有实体返回键,不知道怎么回到照片。原厂应用已有的月历和定时息屏,也希望保留下来,但它能使用的系统权限,我们的应用未必都有。

电脑上看着正常的页面,到了相框上需要重新审视。我开始反复提一些很小的要求:字再大一点,按钮好找一点,提示再短一点,左右滑动不要总是黑一下。每次提出这些要求,都会想到它最后是给谁用的。我可以理解一个技术提示,也可以退出重进试试,父母不应该为了看照片先学会这些。开发往前走,界面就应该替他们多承担一点。

到 8 日,系统逐步成形,开始导入和整理照片。原来已经直接复制到设备上的照片,也要让新软件认出来。我不想再从 NAS 传一遍,于是让客户端比较文件内容,相同的就直接复用。围绕照片导入,几天里一串看起来互相矛盾的数字,反复成了问题。

设备扫描到了二百多张照片,页面却显示匹配为零。我觉得不可能,因为它们本来就是从 NAS 挑出来的。继续查,至少 213 张的内容确实与 NAS 一致,只是原来的统计范围没有把这件事表达出来。再往后,匹配成功了,为什么播放清单还是只有 3 张?原来匹配只是认出了照片,还没有把它们选入并发布。等照片增加到上千张,又出现网站发布了 1924 张,相框当时只确认保存了 252 张的情况。剩下的还在处理,而页面上的“本次待发送 0”,又容易让人以为一切都已经结束。

我一边问,AI 一边解释、排查和修改。最后,页面把几个阶段分开写清楚:网站已发布多少,相框已确认保存多少,还有多少在等待。那些数字终于能让人知道照片走到了哪里。这一轮反复让我意识到,程序知道自己在做什么,还不够。使用它的人也需要知道。尤其是远程设备,我看不到它正在忙什么,页面如果只给我一个含糊的数字,就会把等待变成担心。

老照片的年份也花了不少时间。有些照片经过转存,时间信息并不合适,只能结合文件夹补上年份。第一次修正以后,第二次预览却仍然显示许多照片需要处理。继续检查才发现,程序认得原始年份一致,却没有把已经修正过的年份算进去。这些事情听起来琐碎,却都与同一个愿望有关:照片进去以后,希望它们能被妥善记住。重新打开页面,不要像第一次来;再做一次相同操作,不要又把一切重来。

9 日晚上,照片多起来以后,应用还出现过一次无响应。日志里找到的原因很明确:设置页每秒都在主线程检查整份照片列表。几张图的时候看不出问题,上千张的时候,点击和返回就被拖慢了。统计需要搬到后台,界面读取已经整理好的结果。从第一张测试图片,到上千张真实照片,中间的距离,比我起初想的要长。那些老硬件、旧照片和真实操作,把原型里藏着的问题一一带了出来。

但相框也确实越来越接近我想要的样子。照片在本地播放,网页能更新清单,月历叠在画面上,设备状态和文件可以远程查看。以后离开 USB,维护还要继续,所以同步重试、播放器重启和在线升级也逐步搬进了管理网页。亮度反复比较后,调成了全天 100%。提示文字放大,删除照片要先点出垃圾桶,再确认,而且只处理相框侧,保留 NAS 原图。竖着的照片怎样在横屏里完整展示,左右滑动怎样更顺畅,这些也还在试。刚开始时,我想得更多的是照片怎么传过去。做着做着,注意力逐渐落到了照片到了以后,父母怎样看,遇到事情怎样操作,以及我能不能在远处照顾好这台设备。

AI 在这段时间里帮了很多忙。我把想法和现场问题说出来,它帮我拆解、写代码、查日志、做测试,再把新版本装上去。一些原本可能因为不熟悉开发而一直停在念头里的事情,这次真的走到了设备上。当然,它也会遗漏判断,会把不同范围的数字解释错,会做出一个技术上能运行、实际看着却不舒服的页面。我需要不断追问,把眼前发生的事情告诉它,也把“我希望父母怎么用”说得更清楚。这个过程里,我逐渐学会了用更具体的方式表达自己的想法。

写下这些时,大批照片还在继续接管,长期运行是否稳定,也需要更多时间检验。两年不用现场维护,仍然是当初定下的目标。我们已经把路接通了,接下来还要看它能不能一直走得稳。

那天晚上,我最后提的要求是先别休眠,让相框连夜把照片识别、匹配完。这句话很像这几天的一个缩影:一台旧相框还在工作,一边是 NAS 里多年积攒的照片,一边是正在补齐的软件。看着那些数字慢慢增加,会觉得折腾是有着落的。

以后真正用起来,我希望自己偶尔打开网页,挑几张近来的照片,点一下发送就够了。父母不必知道这一晚扫描了多久,也不必知道中间改过多少次程序。他们只要在看相框的时候,发现又多了几张新的照片。我不在家时,那块屏幕也能替我把一点近况带回去。

标签: Android开发, AI辅助编程, 电子相框, 远程同步, NAS, 适老化设计