guodashen007 2024-03-06 22:13 采纳率: 75%
浏览 25
已结题

小米手机安卓14无障碍获取截屏权限

小米手机安卓14无障碍获取截屏权限,自动点击立即开始

img

Gesture(path, 50L, 0L);

 // 查找安装,并模拟点击(findAccessibilityNodeInfosByText判断逻辑是contains而非equals)
    private void findTxtClick(AccessibilityNodeInfo nodeInfo, String txt) {
        List<AccessibilityNodeInfo> nodes = nodeInfo.findAccessibilityNodeInfosByText(txt);
        Log.i(TAG, "findTxtClick: " + txt + ", " + nodes.size() + ", " + nodes);
        if (nodes == null || nodes.isEmpty()) {
            return;
        }
        Log.i(TAG, "findTxtClick: " + txt + ", " + nodes.size() + ", " + nodes);
        for (AccessibilityNodeInfo node : nodes) {
            node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
        }
    }

 List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId = rootNode.findAccessibilityNodeInfosByViewId("android:id/button1");
                Log.i(TAG, "findTxtClick: 立即开始"   + ", " + findAccessibilityNodeInfosByViewId.size());
                if (findAccessibilityNodeInfosByViewId.size() > 0) {
                    System.out.println("5=====================" + findAccessibilityNodeInfosByViewId.size());
                    Iterator<AccessibilityNodeInfo> it = findAccessibilityNodeInfosByViewId.iterator();
                    while (it.hasNext()) {
                        it.next().performAction(16);
                    }
                    return;
                }

上面三个方法都不管用,有知道怎么弄的吗
人工智能的回答都不管用,自己先试一下能用再回复我吧,价格好谈

  • 写回答

22条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-06 22:13
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    在小米手机安卓14系统中,无障碍服务(AccessibilityService)要实现截屏功能,需要用户明确授权。对于上述的权限获取问题,从你的描述和代码片段来看,你正在尝试通过无障碍服务模拟点击“立即开始”按钮以同意开启屏幕内容捕获权限。

    首先,请确保你的无障碍服务已经在系统设置中启用,并且具备了CAPTURE_WINDOW_CONTENT权限。在AndroidManifest.xml文件中声明无障碍服务时应包含如下权限:

    <service android:name=".YourAccessibilityService">
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibility_service_config" />
    </service>
    
    <!-- 在配置文件中请求权限 -->
    <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:packageNames="com.miui.securitycenter"
        android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged"
        android:accessibilityFeedbackType="feedbackGeneric"
        android:canRetrieveWindowContent="true"
        android:description="@string/accessibility_service_description"
        android:settingsActivity="com.example.YourSettingsActivity"
        android:permissions="android.permission.CAPTURE_WINDOW_CONTENT" />
    

    针对模拟点击“立即开始”按钮的问题,由于不同系统版本和MIUI定制化界面可能存在差异,以下是一种可能的解决方案:

    // 查找并模拟点击“立即开始”按钮
    private void clickStartButton(AccessibilityNodeInfo rootNode) {
        List<AccessibilityNodeInfo> startButtons = findViewByText(rootNode, "立即开始");
        for (AccessibilityNodeInfo node : startButtons) {
            if (node != null && node.isClickable()) {
                node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                break;
            }
        }
    }
    
    // 改进查找节点的方法,增加对文本精确匹配的支持
    private List<AccessibilityNodeInfo> findViewByText(AccessibilityNodeInfo root, String text) {
        ArrayList<AccessibilityNodeInfo> matchedNodes = new ArrayList<>();
        if (root == null) return matchedNodes;
    
        try {
            // 获取所有子节点
            List<AccessibilityNodeInfo> nodes = root.findAccessibilityNodeInfosByViewId("android.view.accessibility.AccessibilityNodeProvider");
            for (AccessibilityNodeInfo node : nodes) {
                // 直接检查文本是否相等,而非contains
                CharSequence nodeText = node.getText();
                if (nodeText != null && nodeText.toString().equals(text)) {
                    matchedNodes.add(node);
                } else {
                    // 递归查找子孙节点
                    matchedNodes.addAll(findViewByText(node, text));
                }
            }
        } finally {
            root.recycle();
        }
    
        return matchedNodes;
    }
    

    请根据实际应用中的界面元素ID或文本内容调整上述代码中的findViewByText方法参数。同时,在无障碍服务运行过程中,确保当弹出窗口出现时再执行查找和点击操作,可以监听到特定窗口状态变化事件后触发查找和点击动作。

    此外,需要注意的是,为了遵守隐私政策和用户隐私保护,部分系统可能会限制无障碍服务直接截取屏幕内容,尤其是涉及敏感信息的部分,因此在开发时务必合规处理此类需求。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月14日
  • 修改了问题 3月13日
  • 修改了问题 3月9日
  • 修改了问题 3月9日
  • 展开全部

悬赏问题

  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制