You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

小米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存储设置里的“清除缓存”按钮,而不是通过“清除数据”弹窗来操作。

火山引擎 最新活动