来源:2026-09-18 真机现场分析。依赖 #309。
clickBackfill 硬性要求 node.isClickable:
clickBackfill
node.isClickable
if (!node.isClickable || !node.isEnabled || !node.isVisibleToUser || ...) return false return node.performAction(AccessibilityNodeInfo.ACTION_CLICK)
而 PDD 订单列表的卡片容器 clickable=false(见 #309 现场证据),无障碍树里不存在可点的卡片入口。#309 修正识别后,卡片仍然点不动,扫描无法进入订单详情页。
clickable=false
#307 已为「全部」导航 tab 开过手势点击(dispatchCenterTap),本工单是同一机制向卡片的受限扩展。
#307
dispatchCenterTap
卡片点击目标不是卡片容器本身,而是卡片内的商品标题文本节点,以手势点击。必须同时满足:
现场验证:第一张卡片的商品标题在 [291,471][876,585],动作行在 [180,900][1047,990],垂直相距 300+ 像素,条件 3 天然成立。
[291,471][876,585]
[180,900][1047,990]
[必须] 仍然是「点击一个真实存在的节点中心」,不是按固定坐标盲点。目标节点必须在当次快照中重新定位并逐项校验后才允许下发手势。
[必须]
[必须] 手势点击只对通过上述全部条件的卡片内文本开放,动作按钮、支付、下单类节点一律不得走此路径。
expansion()
clickable=true
卡片区域邻近订单动作按钮。缓解手段是条件 3 的几何重叠校验与条件 1 的卡片边界约束;两者任一不满足即放弃该卡片而非降级点击。
./gradlew :app:testDebugUnitTest;真机复跑一次回填,确认能进入详情页并读到订单编号与下单时间。
./gradlew :app:testDebugUnitTest
手势点击边界扩展属于长期安全事实,必须更新 Business-Rules-and-Glossary 与 Android-Agent-API-Contract 中回填只读边界条目。
No dependencies set.
The note is not visible to the blocked user.
问题
clickBackfill硬性要求node.isClickable:而 PDD 订单列表的卡片容器
clickable=false(见 #309 现场证据),无障碍树里不存在可点的卡片入口。#309 修正识别后,卡片仍然点不动,扫描无法进入订单详情页。#307已为「全部」导航 tab 开过手势点击(dispatchCenterTap),本工单是同一机制向卡片的受限扩展。方案
卡片点击目标不是卡片容器本身,而是卡片内的商品标题文本节点,以手势点击。必须同时满足:
现场验证:第一张卡片的商品标题在
[291,471][876,585],动作行在[180,900][1047,990],垂直相距 300+ 像素,条件 3 天然成立。[必须]仍然是「点击一个真实存在的节点中心」,不是按固定坐标盲点。目标节点必须在当次快照中重新定位并逐项校验后才允许下发手势。[必须]手势点击只对通过上述全部条件的卡片内文本开放,动作按钮、支付、下单类节点一律不得走此路径。非目标
expansion()的「展开」按钮本身clickable=true,无需改动)。风险
卡片区域邻近订单动作按钮。缓解手段是条件 3 的几何重叠校验与条件 1 的卡片边界约束;两者任一不满足即放弃该卡片而非降级点击。
验收
验证
./gradlew :app:testDebugUnitTest;真机复跑一次回填,确认能进入详情页并读到订单编号与下单时间。文档影响
手势点击边界扩展属于长期安全事实,必须更新 Business-Rules-and-Glossary 与 Android-Agent-API-Contract 中回填只读边界条目。