小米Android 15系统下无障碍服务自动清理缓存功能失效问题求助
小米Android 15系统下无障碍服务自动清理缓存功能失效问题求助
兄弟,我之前也踩过MIUI定制系统对无障碍操作的坑,尤其是Android 15更新后他们调整了不少交互逻辑,结合你给出的Accessibility节点树,给你几个针对性的解决方案试试:
1. 针对ListView子项的精准点击触发
MIUI的这个弹窗用了ListView承载选项,直接点击TextView节点可能不生效,因为真正的点击事件绑定在ListView的Item容器上,或者需要通过ListView的动作参数来指定子项位置:
// 先定位到目标ListView节点 AccessibilityNodeInfo listViewNode = findNodeByViewId("com.miui.securitycenter:id/select_dialog_listview"); if (listViewNode != null) { // 遍历子节点找到"Clear cache"对应的条目 for (int i = 0; i < listViewNode.getChildCount(); i++) { AccessibilityNodeInfo childNode = listViewNode.getChild(i); if (childNode != null && "Clear cache".equals(childNode.getText())) { // 方案A:通过ListView的ACTION_CLICK传递子项位置参数 Bundle clickArgs = new Bundle(); clickArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_ROW_INT, i); boolean isSuccess = listViewNode.performAction(AccessibilityNodeInfo.ACTION_CLICK, clickArgs); if (!isSuccess) { // 方案B:先让子项获取焦点,再执行选中/点击动作 childNode.performAction(AccessibilityNodeInfo.ACTION_FOCUS); childNode.performAction(AccessibilityNodeInfo.ACTION_SELECT); } break; } } }
2. 模拟原生触摸手势(绕过系统限制)
如果无障碍的标准点击动作被MIUI拦截,可尝试通过无障碍服务的手势模拟功能直接点击节点的屏幕区域:
// 先找到"Clear cache"的TextView节点 AccessibilityNodeInfo clearCacheNode = findNodeByText("Clear cache"); if (clearCacheNode != null) { // 获取节点的屏幕坐标 Rect nodeBounds = new Rect(); clearCacheNode.getBoundsInScreen(nodeBounds); // 计算节点中心坐标 int centerX = nodeBounds.left + nodeBounds.width() / 2; int centerY = nodeBounds.top + nodeBounds.height() / 2; // 构建点击手势 GestureDescription.Builder gestureBuilder = new GestureDescription.Builder(); Path clickPath = new Path(); clickPath.moveTo(centerX, centerY); // 添加一个100ms的点击动作(模拟手指按下再抬起) gestureBuilder.addStroke(new GestureDescription.StrokeDescription(clickPath, 0, 100)); // 执行手势 dispatchGesture(gestureBuilder.build(), new GestureResultCallback() { @Override public void onCompleted(GestureDescription gestureDescription) { super.onCompleted(gestureDescription); // 手势执行成功后的处理 } }, null); }
注意:使用这个方法需要确保你的无障碍服务已经申请了模拟手势的权限,在MIUI的无障碍设置里要开启对应权限。
3. 处理弹窗加载延迟
MIUI的弹窗可能有动画过渡,过早执行点击会导致节点未完全渲染,可添加延迟或监听窗口状态变化:
// 方法A:延迟200ms执行点击(等待弹窗完全加载) new Handler(Looper.getMainLooper()).postDelayed(() -> { // 这里放入你的点击逻辑 }, 200); // 方法B:在onAccessibilityEvent中监听弹窗出现 @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { String pkgName = event.getPackageName().toString(); String windowTitle = event.getClassName().toString(); // 检测是否是MIUI的清除数据弹窗 if ("com.miui.securitycenter".equals(pkgName) && "android.app.AlertDialog".equals(windowTitle)) { // 执行点击逻辑 performClearCacheClick(); } } }
4. 检查MIUI专属权限设置
Android 15后MIUI对无障碍服务新增了更严格的权限控制,你需要去:
- 系统设置 → 无障碍 → 你的应用 → 确认开启所有相关权限(比如“允许查看屏幕内容”“允许执行手势”“允许控制设备”)
- 部分机型可能还有“精确操作权限”,需要手动开启
额外调试技巧
可以在代码中打印节点支持的所有动作,看看有没有隐藏的可用动作:
if (clearCacheNode != null) { List<Integer> supportedActions = clearCacheNode.getActionList(); for (int action : supportedActions) { Log.d("Accessibility", "Supported action: " + action); } }
比如有些节点可能支持ACTION_TAP而不是ACTION_CLICK,可以尝试替换动作类型。
如果以上方法都不行,可能是MIUI在Android 15中对这个弹窗做了特殊的防自动化处理,这时候可以试试先模拟按下“返回”键关闭弹窗,再重新触发清除缓存的流程(有些场景下直接进入APP的存储设置页面,绕过这个弹窗),或者调整你的流程,直接定位到APP存储设置里的“清除缓存”按钮,而不是通过“清除数据”弹窗来操作。




