当前位置:  开发笔记 > Android > 正文

Android无法使用辅助功能服务在少数设备上阅读窗口内容

如何解决《Android无法使用辅助功能服务在少数设备上阅读窗口内容》经验,为你挑选了1个好方法。

我的要求:从特定应用的弹出窗口,对话框等中读取文本.

我已经实现了一个辅助功能服务,我按照我的要求接收了适当的事件和数据.然而,在测试时,我意识到在某些设备上而不是使用AlertDialog或Dialog,他们使用了一个活动(主题为对话框).因此,在我的辅助功能事件中,我只收到活动标题,是否有一种方法可以找到此特定弹出活动显示的文本?

我搜索得非常努力,但在这个主题上得不到多少帮助,文档也没有任何好处.可访问性服务的代码并不多,但如果您仍然需要,我会稍后发布.

谢谢



1> vishal sharm..:

即使在电话返回的情况下,也可以使用accessiblityNodeInfo来获取信息,它将获取ussd响应,当有选项输入多个选项时,它也会解除对话框.

首先,如果[pohne]事件类名称作为ussdalertactivty返回,所以我只使用"alert"来识别ussd响应的警报对话框.

public void onAccessibilityEvent(AccessibilityEvent event) {
    if (event.getPackageName().toString().equals("com.android.phone")
                        && event.getClassName().toString().toLowerCase()
                                .contains("alert")) {

                    AccessibilityNodeInfo source = event.getSource();

                    if (source != null) {
                    String pcnResponse = fetchResponse(source);
                    }
    }

现在我已经创建了一个名为fetchResponse的函数,它将把pcn的响应作为字符串返回,并且还会关闭对话框,因此需要执行performGlobalAction(GLOBAL_ACTION_BACK).

private String fetchResponse(AccessibilityNodeInfo accessibilityNodeInfo) {

        String fetchedResponse = "";
        if (accessibilityNodeInfo != null) {
            for (int i = 0; i < accessibilityNodeInfo.getChildCount(); i++) {
                AccessibilityNodeInfo child = accessibilityNodeInfo.getChild(i);
                if (child != null) {

                    CharSequence text = child.getText();

                    if (text != null
                            && child.getClassName().equals(
                                    Button.class.getName())) {

                        // dismiss dialog by performing action click in normal
                        // cases
                        if((text.toString().toLowerCase().equals("ok") || text
                                        .toString().toLowerCase()
                                        .equals("cancel"))) {

                            child.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                            return fetchedResponse;

                        }

                    } else if (text != null
                            && child.getClassName().equals(
                                    TextView.class.getName())) {

                        // response of normal cases
                        if (text.toString().length() > 10) {
                            fetchedResponse = text.toString();
                        }

                    } else if (child.getClassName().equals(
                            ScrollView.class.getName())) {

                        // when response comes as phone then response can be
                        // retrived from subchild
                        for (int j = 0; j < child.getChildCount(); j++) {

                            AccessibilityNodeInfo subChild = child.getChild(j);
                            CharSequence subText = subChild.getText();

                            if (subText != null
                                    && subChild.getClassName().equals(
                                            TextView.class.getName())) {

                                // response of different cases
                                if (subText.toString().length() > 10) {
                                    fetchedResponse = subText.toString();
                                }

                            }

                            else if (subText != null
                                    && subChild.getClassName().equals(
                                            Button.class.getName())) {

                                // dismiss dialog by performing action click in
                                // different
                                // cases
                                if ((subText.toString().toLowerCase()
                                                .equals("ok") || subText
                                                .toString().toLowerCase()
                                                .equals("cancel"))) {
                                    subChild.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                                    return fetchedResponse;
                                }

                            }
                        }
                    }
                }
            }
        }
        return fetchedResponse;
    }

希望这将解决问题,无论设备如何.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有