Hierarchy Viewer可讓您通過將手機連接到筆記本電腦來提取有關UI元素的信息。它通過輪詢窗口管理器/視圖管理器以通過adb獲取信息。如何在運行時提取有關android應用程序中UI元素的信息?
我想知道是否有可能在運行時使用後臺服務提取手機前臺屏幕的UI信息?
我正在嘗試構建無障礙服務(類似於Talkback),並試圖找到一種方法來收集有關活動前景屏幕上所有UI元素(其類(例如按鈕)和位置)的信息。我已經能夠提供無障礙服務,但是我一直無法找到獲取UI信息的方式。
Hierarchy Viewer可讓您通過將手機連接到筆記本電腦來提取有關UI元素的信息。它通過輪詢窗口管理器/視圖管理器以通過adb獲取信息。如何在運行時提取有關android應用程序中UI元素的信息?
我想知道是否有可能在運行時使用後臺服務提取手機前臺屏幕的UI信息?
我正在嘗試構建無障礙服務(類似於Talkback),並試圖找到一種方法來收集有關活動前景屏幕上所有UI元素(其類(例如按鈕)和位置)的信息。我已經能夠提供無障礙服務,但是我一直無法找到獲取UI信息的方式。
我能找到一個答案我的問題。
Android可訪問性API提供了此功能。我能夠實現一項輔助功能服務,對於每個輔助功能事件,我都能夠使用Accessibility Node Info函數,它實質上是前景屏幕上所有UI元素的樹形表示。例如,一個線性佈局由一個按鈕和一個圖像組成,那麼該按鈕和圖像將是LL的孩子。
樹的根可以發現:
AccessibilityNodeInfo rootNode = getRootInActiveWindow();
然後我能穿越使用getChild()
功能這給我上的所有UI元素的列表樹(廣度優先搜索)活動屏幕。
希望它可以幫助別人!
我寫了一些代碼,工作正常,也許這是你想要的。
首先,獲取內容視圖:
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());
}
}
}
這適用於我自己的應用程序(當我的活動打開時),但不適用於Android上打開任何其他應用程序時。我錯過了什麼嗎? –
嗨,是否有可能從imageview中獲取圖像內容? – kenn3th