2017-02-25 58 views
0

Hierarchy Viewer可让您通过将手机连接到笔记本电脑来提取有关UI元素的信息。它通过轮询窗口管理器/视图管理器以通过adb获取信息。如何在运行时提取有关android应用程序中UI元素的信息?

我想知道是否有可能在运行时使用后台服务提取手机前台屏幕的UI信息?

我正在尝试构建无障碍服务(类似于Talkback),并试图找到一种方法来收集有关活动前景屏幕上所有UI元素(其类(例如按钮)和位置)的信息。我已经能够提供无障碍服务,但是我一直无法找到获取UI信息的方式。

回答

0

我能找到一个答案我的问题。

Android可访问性API提供了此功能。我能够实现一项辅助功能服务,对于每个辅助功能事件,我都能够使用Accessibility Node Info函数,它实质上是前景屏幕上所有UI元素的树形表示。例如,一个线性布局由一个按钮和一个图像组成,那么该按钮和图像将是LL的孩子。

树的根可以发现:

AccessibilityNodeInfo rootNode = getRootInActiveWindow(); 

然后我能穿越使用getChild()功能这给我上的所有UI元素的列表树(广度优先搜索)活动屏幕。

希望它可以帮助别人!

+0

嗨,是否有可能从imageview中获取图像内容? – kenn3th

1

我写了一些代码,工作正常,也许这是你想要的。

首先,获取内容视图:

ViewGroup parent = (ViewGroup) findViewById(android.R.id.content); 

然后使用一种方法来检查父视图的每一个元素:

private void showViewInfo(View view){ 
    if(view instanceof ViewGroup){ 

     //do something when find view group: 
     System.out.println(view.getClass().toString()+"\tx:"+view.getX()+"\ty:"+view.getY()); 


     for(int i=0;i<((ViewGroup) view).getChildCount();i++){ 
      showViewInfo(((ViewGroup) view).getChildAt(i)); 
     } 
    }else{ 

     //do something when find children 
     System.out.println(view.getClass().toString()+"\tx:"+view.getX()+"\ty:"+view.getY()); 
    } 
} 

最后,调用与作为参数父视图的方法:

showViewInfo(parent); 

你可以得到像这样的东西:

System.out: class android.support.v7.widget.ContentFrameLayout x:0.0 y:0.0 

这里是整个代码:

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    ViewGroup parent = (ViewGroup) findViewById(android.R.id.content); 
    showViewInfo(parent); 
} 

private void showViewInfo(View view){ 
    if(view instanceof ViewGroup){ 
     //do something when find view group: 
     System.out.println(view.getClass().toString()+"\tx:"+view.getX()+"\ty:"+view.getY()); 
     //find the children 
     for(int i=0;i<((ViewGroup) view).getChildCount();i++){ 
      showViewInfo(((ViewGroup) view).getChildAt(i)); 
     } 
    }else{ 
     //do something when find children 
     System.out.println(view.getClass().toString()+"\tx:"+view.getX()+"\ty:"+view.getY()); 
    } 
} 

}

+0

这适用于我自己的应用程序(当我的活动打开时),但不适用于Android上打开任何其他应用程序时。我错过了什么吗? –

相关问题