项目名称:双镜记忆相机
手机里最容易变多的东西,往往不是文件,而是照片。一次旅行、一次见面、一次偶然路过的街口,最后都会变成相册里几十张相似的缩略图。时间久了,照片还在,但“为什么拍、和谁拍、在哪里拍”会先一步变模糊。
双镜记忆相机的出发点不是替代系统相册,而是做一个更垂直的记忆入口:以地图为底座,用前后双拍记录人和景,用智能体唤起附近地点,用端云同步承接换机和多设备,用隐私防窥守住不想被旁人看见的画面。它更像一本会定位、会提醒、会整理、会流转的个人记忆册。
我在实现时没有把 HarmonyOS 6.1 能力当成“功能清单”堆进去,而是先从官方新能力页里挑出与记忆相机真正相关的能力,再把它们压进一个完整闭环:拍摄,定位,整理,生成,分享,同步,保护。
01 先把新能力放进作品逻辑
HarmonyOS 6.1 的特性很多,双镜记忆相机重点选择了与照片记忆强相关的能力,并把它们分成“已落地能力”和“可延展能力”两层。
| 官方特性页能力 | 在双镜记忆相机中的落点 | 当前处理方式 |
|---|---|---|
| 沉浸光感组件 | 首页地图、底部导航、相机页、照片详情页的光感式空间层级 | 已作为视觉和布局语言落地,适配深浅色、沉浸式安全区和大屏布局 |
| 智能体 | 首页附近景点智能体,支持根据当前位置推荐周边内容 | 已接入 InsightIntent 与位置服务 |
| 智感握姿 | 左手、右手、双手握持时调整交互重心 | 已接入 MultimodalAwarenessKit,并保留设备不支持时的降级 |
| 碰一碰 | 公开照片或短片的近场分享入口 | 已接入 ShareKit knockShare 能力 |
| AI 隔空传送 | 隔空手势触发附近分享 | 已接入 gesturesShare 注册与回调 |
| 华为分享 | 照片、短片对外流转 | 已使用系统分享与 ShareKit 承接 |
| 跨设备互通 | 手机拍摄,平板或电脑继续查看、整理 | 已从布局和账号同步两侧做适配 |
| 应用接续 | 从一台设备继续浏览同一组记忆 | 作为下一阶段能力,当前先完成同账号数据恢复 |
| 实况窗 | 短片生成、故地重游提醒、同步进度 | 当前完成通知和点击回流,可继续升级为实况窗 |
| 隐私防窥 | 查看照片、保险箱时识别窥屏状态并遮挡 | 已接入 DeviceSecurityKit 防窥能力 |
| 预加载与端云能力 | 登录后同步照片索引、缩略资产和短片记录 | 已用 Cloud Foundation Kit 完成数据快照同步 |
| 3D ToF | 更高可信的人像与距离感知保护 | 作为后续增强点,不在当前版本里硬写成已完成 |
02 地图是底座,不和系统相册抢入口
照片多的时候,传统相册的时间轴会越来越长。双镜记忆相机换了一个视角:每张照片先落到地图上,成为一个可以被重访的坐标。用户不是在几千张图里翻找“那天的照片”,而是在地图上回到“那条路、那家店、那座桥”。
这部分用 LocationKit 获取当前位置,用地图能力承载记忆点,再根据日期、地点和距离把照片归成组。首页不做大而全的相册入口,而是围绕“附近”和“记忆点”展开。用户打开应用时看到的是地图、当前位置、附近景点、曾经拍过的照片,而不是一整面测试缩略图。
沉浸光感组件给了这个界面很好的方向。地图不应该被厚重面板压住,底部导航也不应该挡住地图缩放和标记。我把首页设计成更轻的光感层:地图在底,记忆卡片悬浮,导航贴合安全区,深色模式下用柔和高光暗示边界,浅色模式下用低饱和玻璃感减少遮挡。这样既能保留空间感,也能让用户的注意力停在照片和地点上。
开发上需要特别注意三个点:
// 位置获取失败时,不直接抛给用户专业错误,而是给出可行动提示constrequest:geoLocationManager.SingleLocationRequest={locatingTimeoutMs:10000,locatingPriority:geoLocationManager.LocatingPriority.PRIORITY_ACCURACY};constcurrentLocation=awaitgeoLocationManager.getCurrentLocation(request);第一,定位服务关闭、权限未授权、当前位置不新鲜,提示文案要像面向用户的产品文案,而不是像日志。第二,地图控件要让出底部导航高度,尤其是真机上还有手势条和不同屏幕比例。第三,平板和电脑上不能简单放大手机界面,而是要把地图、列表、详情拆成左右结构,让大屏真的可用。
03 双镜记录“人、景、物”
很多照片只留下景,过了很久却想不起当时是谁站在镜头后面。双镜记忆相机把后摄画面作为主照片,把前摄画面作为小窗叠在左下角,让“我在这里”的证据也进入画面。它不是自拍贴纸,而是记忆关系的一部分。
这里对应的是 CameraKit 的拍摄能力和图像合成服务。实现时我把双拍拆成两个阶段:先完成主摄拍摄,再由用户明确触发第二次拍摄,避免自动抢拍造成误操作。第二次拍摄完成后,DualPhotoComposerService会把前摄照片裁成圆形小窗,按主图尺寸计算边距、描边和阴影,再输出一张完整照片。
这类功能在真机上最怕“看起来能跑,操作起来很卡”。所以我把合成尺寸做了上限,前摄小窗按比例计算,避免超大图直接拖慢第二次拍照后的等待时间。用户感知上,按钮状态也要清楚:正在连接相机、等待第二拍、正在合成、保存完成,最好都能在界面上说人话。
04 智能体让“附近”和“故地重游”变成入口
双镜记忆相机的首页里有一个附近景点智能体。它不是聊天框,而是一个很轻的入口:用户点一下,智能体拿到当前位置,再把周边适合拍照、适合重游、适合生成记忆故事的地点推荐出来。另一条线是“故地重游”,当用户回到曾经拍照的地方,系统可以提醒他打开当时的照片,重新看见那天的人和景。
端侧调用的关键是 InsightIntent 与位置服务的配合。当前工程中,智能体入口通过NearbyAgentLocationIntent调用AgentLocationService,位置服务会优先使用新鲜的最近位置,不够新再请求当前定位,并把坐标转换成适合地图插件使用的格式。
constlocationResult=awaitAgentLocationService.getCurrentLocation();return{code:0,result:{success:locationResult.success,amapLocation:locationResult.amapLocation,accuracyMeters:locationResult.accuracyMeters,resultDesc:locationResult.resultDesc}};这里我有一个很深的体会:智能体能力不能只演示“能调起来”。真正有价值的是让它成为应用里的一个自然动作。用户在地图上找附近景点,智能体提供附近推荐;用户在相册里选了多张照片,智能描述补齐文字;用户准备分享,一键成片把照片变成短片。AI 不应该抢主流程,而应该把原来麻烦的步骤压短。
05 从照片到短片,一键把回忆讲出来
照片整理完之后,下一步往往是分享。用户不一定想手动剪辑,但很愿意得到一条有节奏的回忆短片。双镜记忆相机在相册里提供两条路径:普通成片和智能生成短片。
普通成片走本地图片解码、帧序列和配乐合成,适合快速生成;智能生成短片可以结合照片内容、地点、时间和文字描述,生成更有故事感的成片。为了避免用户误解,界面里不展示“CloudFoundation”“模型任务”等专业词,而是显示“登录后同步”“同步完成”“生成中”“导出到相册”这些用户能理解的状态。
这部分也适合和实况窗做进一步结合。比如短片生成时间较长时,可以把生成进度放进实况窗;故地重游推送触发后,也可以从实况窗一键回到对应记忆点。当前版本先完成了通知、点击回流和视频记录管理,后续可以继续接入更完整的系统级展示。
06 碰一碰、隔空传送和华为分享,让记忆自然流转
照片应用不能只停在“本机能看”。尤其是双镜记忆相机这种偏记忆整理的工具,很容易出现三个场景:手机拍完,平板整理;手机生成短片,电脑演示;换机之后,希望登录账号还能找回照片索引和私密记录。
分享层面,工程里同时保留了系统分享和 ShareKit 能力。普通按钮走系统分享,近场互动可以走碰一碰和隔空手势。
harmonyShare.on('knockShare',this.nearbyShareCallback);harmonyShare.on('gesturesShare',registry,this.nearbyShareCallback);这样做的好处是入口不会变复杂。用户仍然看到“分享”这个动作,但在合适设备、合适场景下,可以自然升级成碰一碰或隔空传送。对开发者来说,也要处理好无内容、文件未生成、分享中、设备不支持这些状态,否则新能力反而会显得不稳定。
同步层面,双镜记忆相机接入 Cloud Foundation Kit,把照片记录、短片记录和压缩后的云端资产组织成同账号快照。用户登录华为账号后,应用先显示账号名称,再同步;同步完成后只提示“同步完成”。如果登录失败,也不把 SDK 错误直接扔出来,而是提示用户重新登录或稍后再试。
跨设备互通不只是一句口号。手机、平板、电脑的页面密度和操作方式完全不同:手机需要底部导航和单列流程,平板适合左右分栏,电脑或 2in1 更适合侧边导航、地图大画布和详情面板。数据同步解决“能不能继续”,响应式布局解决“继续之后好不好用”。
07 智感握姿让界面理解手
相机和地图都是强手持场景。左手拿、右手拿、双手拿,适合点击的位置并不一样。HarmonyOS 6.1 的智感握姿能力给了一个很有意思的切入点:界面可以感知用户当前握持方式,然后调整主要按钮和推荐卡片的重心。
工程里通过 MultimodalAwarenessKit 监听holdingHandChanged,根据左手、右手、双手状态更新 UI 偏移。比如用户右手握持时,核心按钮更靠近右下;双手握持时,底部操作更居中;如果设备不支持或权限未开启,就退回默认布局。
motion.on('holdingHandChanged',this.holdingHandChangedCallback);这个能力不适合做得很夸张。真正好的交互应该是用户不一定注意到它,但会感觉按钮更顺手。双镜记忆相机里,我把它放在地图推荐、相机按钮和底部导航这些高频位置上,不把它做成一个单独的炫技页面。
08 隐私防窥和保险箱,守住不想被旁人看见的照片
照片是非常私密的数据。双镜记忆相机里有两层保护:第一层是保险箱,用户需要本地认证后才能查看、恢复或导出私密照片;第二层是隐私防窥,进入相册、详情或保险箱时,如果系统识别到旁人窥屏,就给照片区域加遮罩。
constenabled=awaitdlpAntiPeep.isDlpAntiPeepSwitchOn();dlpAntiPeep.on('dlpAntiPeep',this.galleryAntiPeepCallback);awaitdlpAntiPeep.setAntiPeepMaskLayer(windowId);这类安全能力有两个细节很重要。第一,权限和设备能力要说清楚:缺少防窥权限、设备不支持、系统开关未开启,是三种完全不同的情况。第二,文案要面向用户,而不是面向评审或开发者。用户不需要知道“DLP Anti Peep”,只需要知道“防窥保护已开启”“系统防窥未开启”“设备暂不支持防窥”。
保险箱的数据也必须跟账号同步闭环打通。否则用户换机后,普通相册恢复了,私密照片却丢了,这会直接破坏信任。当前工程把保险箱记录纳入同一套同步状态里,登录后再同步,未登录时提醒用户先登录账号。
09 不是堆特性,而是让记忆闭环更完整
回头看这个项目,HarmonyOS 6.1 新能力真正帮到我的地方,是把“拍一张照片”扩成了一个更完整的系统体验:
拍摄时,CameraKit 和双镜合成让人、景、物同时被记录。
整理时,MapKit、LocationKit 和智能体把照片落到地图和附近地点上。
生成时,智能描述和一键成片把静态照片变成可分享的故事。
流转时,碰一碰、隔空传送、华为分享和端云同步让记忆跨设备移动。
保护时,隐私防窥、保险箱和本地认证让照片只在合适的人面前出现。
设计时,沉浸光感、深浅色模式、平板和电脑适配让同一套代码在不同设备上保持秩序感。
对我来说,双镜记忆相机最想表达的不是“我用了多少个新能力”,而是“这些能力能不能真的让一个场景变好”。照片值得被记住,不只是因为它清晰,而是因为它能把当时的人、地点、时间和心情重新带回来。HarmonyOS 6.1 提供的系统能力,让这种记忆不再只停在一张图里,而是可以被唤起、被整理、被分享,也被安静地保护起来。