【问题标题】:How to perform Other app list item click using accessibility service like Voice Access app?如何使用语音访问应用程序等辅助功能服务执行其他应用程序列表项单击?
【发布时间】:2017-08-31 12:21:18
【问题描述】:

我正在开发一个应用程序,例如 VoiceAccess 应用程序。使用辅助功能服务,我能够执行所有顶级活动(第 3 方应用程序)的点击。但我面临 ListItem 点击的问题。我正在为 Facebook 应用程序尝试此代码。下面是我的代码。谁能帮我解决这个问题。

public class MyService extends AccessibilityService {

/**/
private SharedPreferences S_PREF;
private SharedPreferences.Editor editor;

private static final String TAG = MyService.class
        .getSimpleName();

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    clickPerform(getRootInActiveWindow(), 0);
}

public void clickPerform(AccessibilityNodeInfo nodeInfo, final int depth) {

    if (nodeInfo == null) return;

    List<AccessibilityNodeInfo> list = nodeInfo
            .findAccessibilityNodeInfosByViewId("com.facebook.katana:id/bookmarks_tab");
    for (AccessibilityNodeInfo node : list) {

        Log.i(TAG, "ViewID-: bookmarks_tab " + node.getChild(0));

        if (S_PREF.getBoolean("fb_menu", false)) {
            editor.putBoolean("fb_menu", false);
            node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
        }
    }
    List<AccessibilityNodeInfo> list2 = nodeInfo
            .findAccessibilityNodeInfosByViewId("com.facebook.katana:id/bookmarks_list");
    for (AccessibilityNodeInfo node2 : list2) {
        if (node2.getChild(0) != null)
        if (S_PREF.getBoolean("fb_scroll_down", false)) {
            editor.putBoolean("fb_scroll_down", false);
            node2.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
        }
    }
    editor.commit();
    for (int i = 0; i < nodeInfo.getChildCount(); ++i) {
        clickPerform(nodeInfo.getChild(i), depth+1);
    }
}



@Override
public void onInterrupt() {

}

protected void onServiceConnected() {
    S_PREF = getSharedPreferences("S_PREF", Context.MODE_PRIVATE);
    editor = S_PREF.edit();
    AccessibilityServiceInfo info = new AccessibilityServiceInfo();
    info.flags = AccessibilityServiceInfo.DEFAULT;
    info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED;
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
    setServiceInfo(info);
    Toast.makeText(getApplicationContext(), "onServiceConnected", Toast.LENGTH_SHORT).show();
     }
}

下面是 VoiceAccess 屏幕。 当用户说出任何数字时,将执行特定的项目点击。

我能够获得 7、8、9、10 个事件,但从 11 个开始,我无法单独获得列表项。我的代码仅返回 listview id。

提前谢谢....

【问题讨论】:

  • "但我遇到了 ListItem 点击的问题" 您至少需要解释一下“问题”是什么......即(a) 正是你所做的(我会说一个介于 11 和 20 之间的数字,但要明确); (b) 完全符合您的期望/希望它会做什么;和 (c) 正是它所做的 所做的(如果那是“没什么”,那么明确地说出来)。
  • 问题是,我能够获取列表视图 ID,但不能获取列表项 ID/列表大小等。如果我们要执行项目单击,我们必须知道列表项位置或确切视图。这样只有我们可以执行选定的项目单击。我不明白如何获得该列表项视图。在上图中,如果我们说 11 特定项目点击像 instagram 在浏览器中打开等...像这样我必须以编程方式执行...感谢您的响应...
  • 您找到解决方案了吗?我也面临同样的问题

标签: android accessibilityservice


【解决方案1】:

@steveenzoleko

我自己解决了这个问题。这里 AccessibilityNodeInfo 始终不返回完整列表或列表大小。它返回视图。它可能是 TextView、Button 等...每个视图都有多种方法,例如 getText()、getContentDescription()、getClassName()、getChildCount()、getViewIdResourceName() 等...这里语音访问应用程序检测所有视图并给它们一些数字。对于列表,使用 for 循环中的 getChildCount() 方法我们可以获取ChildViews/listItems。例如:

AccessibilityNodeInfo node = getRootInActiveWindow();
if(node != null) {
   for(int i = 0; i < node.getChildCount(); i++){
      AccessibilityNodeInfo childNode = node.getChild(i);
      if(childNode != null){
        Log.i("childNode", "-----getText->"+childNode.getText()+"---getContentDescription-->"+childNode.getContentDescription() );
      }
   }
}

使用 getText() 和 getContentDescription() 方法来了解 textview、按钮、复选框的文本。

getClassName() 方法重新调整视图类型,如 TextView、Button、ImageView、CheckBox 等...

【讨论】:

  • 你能回答这个问题吗stackoverflow.com/q/49734263/4813904
  • @BHARADWAJ Marripally:我和你有同样的问题,来自某些列表视图的项目。不幸的是,即使我尝试将点击发送到父视图,我也无法使用childNode.performAction(AccessibilityNodeInfo.ACTION_CLICK) 发送点击,因为childNode.isClickable() 返回 false。你能帮我提供一个 sn-p 或链接的想法吗?
【解决方案2】:

也许您可以使用 AccessibilityService API 7.0 中的 dispatchGesture。

【讨论】:

    猜你喜欢
    • 2014-02-16
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多