2017-02-25 57 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上打開任何其他應用程序時。我錯過了什麼嗎? –

相關問題