2017-08-31 50 views
0

我正在開發一個像VoiceAccess應用程序的應用程序。使用輔助功能服務,我可以執行頂級活動(第三方應用程序)上的所有點擊。但是我面臨着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屏幕。 enter image description here 當用戶說任何號碼,然後將執行特定的項目點擊。

我能夠獲得7,8,9,10事件,但從11起,我沒有單獨獲取列表項。我的代碼只返回listview標識。

在此先感謝....

+0

「_but我現在面臨的問題與列表項clicks_」至少,你需要解釋一下什麼是「問題」是......即**(a)**正是你所做的事(我會說_11_20的數字,但要明確); **(b)**正是你期望/希望它會做的;和**(c)**正是它做了什麼(如果這是「沒有」,明確地說)。 – TripeHound

+0

的問題是,我能夠得到listview id,但沒有列出項目ID /列表大小等。如果我們想要執行項目點擊,我們必須知道列表項目的位置或確切的視圖。所以只有我們可以執行選定的項目點擊。我不理解如何獲取該列表項視圖。在上面的圖像,如果我們說11特定項目點擊像instagram在瀏覽器等打開像這樣我必須以編程方式執行... 感謝您的響應... –

+0

你有沒有找到一個解決方案呢?我面臨同樣的問題 –

回答

0

@steveenzoleko

我自己得到了這個問題的解決方案。此處 AccessibilityNodeInfo始終不會返回完整列表或列表大小。它返回VIEWs。它可能是TextView,Button等等...每個視圖都有多個方法,比如getText(),getContentDescription(),getClassName(),getChildCount(),getViewIdResourceName()等等...這裏Voice Access應用程序檢測所有視圖並給它們一些數字。對於列表,在for循環中使用getChildCount()方法,我們可以getChildViews/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()方法知道文本視圖,按鈕,複選框的文本。

getClassName()方法retuns像TextView的,巴頓,ImageView的,複選框等視圖類型...

相關問題