剪映(CapCut)一键成片与相册选图
本 Skill 指导你如何获取目标照片、统一存入 A_latest 相册,并在剪映中完成「一键成片」。
何时使用
用户要:打开剪映、一键成片、从相册选多张图(按时间或按主题)、去成片 / 导出视频 等多步 UI 操作时加载本 Skill。
包名:com.lemon.lv
相册名 A_latest(硬规则)
- 本流程使用的相册名有且只有一个:
A_latest(与Pictures/A_latest/及剪映「照片视频」下拉显示一致)。 - 禁止变体:
A_latest_风景、主题_A_latest、latest、带空格等;主题/时间只体现在检索,不要写进相册名。 - 入库前必须先清相册:最终写入时
copy_images_to_album须clear_album_first: true。 - 任意检索前也须先清空
A_latest(路径 A、路径 B 相同):见下「步骤 0」。避免旧副本混入按时间的list_gallery_images结果,也避免按内容选图时相册里仍残留上一轮素材、与本次拷贝混淆。
核心策略:如何获取照片与目标张数 K
在进入剪映前,必须先确定要选哪些照片以及目标张数 K。不论是按时间还是按主题,所有选出的照片都必须先复制到 A_latest 相册中,然后在剪映里统一从 A_latest 相册中选取。
步骤 0:先清空 A_latest(路径 A 与路径 B 必做,先于一切检索)
在任何 list_gallery_images(路径 A)或 memory_search / memory_get(路径 B)之前,先调用 copy_images_to_album:
album_name: "A_latest"clear_album_first: true- 不要传
content_uris/media_ids→ 工具只清空该相册(空相册则删除 0 条)。
原因简述:
- 路径 A:
A_latest里旧副本仍在 MediaStore 时,date_preset等未按相册排除的检索会把它们和真实目标照片混在一起。 - 路径 B:先清空可保证后续写入
A_latest时相册状态干净,不与上一轮成片残留混淆。
可选探针(与直接先清空等价):先 list_gallery_images,album_filter: "A_latest",limit: 1;仅当 count ≥ 1 时再执行上述仅清空调用。
步骤 1:获取目标照片的 content_uris
完成步骤 0 后,按用户需求二选一:
路径 A:基于时间或相册名(非主题语义)
适用场景:用户明确要求「今天拍的照片」「昨天的照片」「最近 24 小时」,或者指定了具体的系统相册名。 操作步骤:
- 调用
list_gallery_images,使用date_preset(today|yesterday|last_24h) 或album_filter(必要时提高limit,最大 100)。 - 从返回的图片列表中提取所有的
content_uri。
路径 B:基于特定主题、事件或图像内容
适用场景:用户要求按内容找图,如「风景」「海边」「猫」「去北京旅行」。 操作步骤:
- 提取主题词:从用户话里抽出检索用词。
- 检索 image-memories(按内容找图时不要用
list_gallery_images的name_filter当主题检索:文件名多为IMG…,不含「风景」「猫」等语义,易得到 0 条):- 调用
memory_search,query填主题词;可适当增大maxResults(建议 ≥ 10)、略降minScore(建议 ≤ 0.4)以多召回。 - 遍历返回的
citations列表,逐条memory_get,提取content_uri或media_id;不要只读一段就停,避免漏图。
- 调用
步骤 2:写入固定相册 A_latest(硬规则)
无论走的是路径 A 还是路径 B,拿到 content_uris 或 media_ids 后:
- 调用
copy_images_to_album:album_name: "A_latest",传入收集到的content_uris或media_ids,clear_album_first: true(再次清空后拷贝;与步骤 0 衔接,避免遗漏或并发下残留)。 - 拷贝后调用
list_gallery_images,album_filter: "A_latest",记下返回的count,这就是目标张数 K。 - 在剪映中,必须先点「照片视频」下拉选择
A_latest相册,再进行选图。
剪映操作执行步骤
1. Deep Link 直达一键成片相关页(优先)
无需在剪映首页再点「一键成片」时,用 device action=open 传 uri + package_name:
device(action="open", package_name="com.lemon.lv", uri="videocut://template/smart_recommend?enter_from=intelligent_edit&tab_name=edit")
随后 device(action="snapshot") 确认是否已进入选素材界面。若出现「是否允许打开剪映」等系统权限弹窗(如 com.oplus.securitypermission),先点允许再 snapshot。若 Deep Link 失败,请在首页用 ref 点击 text '一键成片'。
2. 选素材页:相册与分类切换
snapshot vs screenshot 硬规则(违反必失败) 全程只能用
device(action="snapshot")返回带 refs 的无障碍树并用tap ref点击。禁止用screenshot盲猜坐标。
- 先点相册下拉(硬规则):在树里找到
link '照片视频'这一行,tap这一行的ref(带上snapshot_id)。禁止用同区域附近的无文案button代替。 - 选择
A_latest相册:展开列表后再snapshot,在列表里找text 'A_latest'(名称精确为 A_latest,无后缀)。- 正确:
tap紧挨在text 'A_latest'的「上一节点」那个button的 ref。 - 错误:误点后面的
button(那是下一行相册)。
- 正确:
- 切换到「全部」Tab(重要):
- 选中
A_latest后,剪映默认可能停留在「照片」或「视频」Tab。 - 必须在顶部 Tab 栏找到
text '全部'(或button '全部'),点击其对应的 ref。 - 目的:确保能看到
A_latest相册下的所有素材(无论图片还是视频)。 snapshot确认全部已被选中(selected)。
- 选中
3. 勾选素材(点「圈」不点「大图」)(批量点击)
- 勾选注意事项
在相册网格中,每个格子常出现一对相邻节点(先大块
button再小link圈):- 只点勾选小圈:多为
link(未选中时无文案,选中后常带序号如link '1' (selected))。 - 禁止点大块无文案
button:那是整张缩略图区域,点击会进入大图预览。
- 只点勾选小圈:多为
- 使用
multi_tap勾选全部:- 在当前 Tab 网格中,只列各格勾选小圈的 ref(多为
link),勿混入同格大块无文案缩略图button。 multi_tap单次最多 15 个 ref(与单屏可见格数一致);超出则:multi_tap 一批 →snapshot→ 滚动 → 再multi_tap下一批。重复 ref 会去重(保序)。- 每次
act(含multi_tap)须带当前最近一次snapshot返回的snapshot_id(严格模式下 ref 会过期)。
- 在当前 Tab 网格中,只列各格勾选小圈的 ref(多为
- 校验:
- 核对张数:每次点击或
multi_tap后必须snapshot,核对底部下一步 (N)的 N 是否达到目标张数 K。 - 易错:界面常出现「选择3个以上素材,成片效果更佳」,这只是推荐,绝不表示选 3 张就可以点下一步。必须选到 N = K。
- 核对张数:每次点击或
4. 等待与下一步
下一步 (N)的 N = K 后,点击「下一步」。- 后续生成/导出环节,必须使用
act+wait进行等待:
错误:device(action="act", kind="wait", timeMs=10000)device(action="wait")。 - 导出很慢时应用多次短 wait + snapshot,不要假设一次等 10 分钟已生效。
简要检查清单
- 步骤 0(两路径相同):
copy_images_to_album(A_latest+clear_album_first: true,无 URIs)仅清空。 - 检索:路径 A →
list_gallery_images;路径 B →memory_search/memory_get→ 得到content_uri列表。 - 统一入库:
copy_images_to_album(A_latest+clear_album_first: true+ 本次 URIs)→list_gallery_imagesalbum_filter: "A_latest"得 K。 - 进入剪映:优先 Deep Link,失败则首页 ref 点击。
- 选相册集:下拉选择
A_latest。 - 切全部 Tab:必须点击「全部」Tab,确保素材可见。
- 选图:只点勾选小圈(
link);multi_tap(≤15/次)配合snapshot。 - 核对与等待:
下一步 (N)直到 N = K;act+wait再snapshot。