2016-08-05 88 views
3

我想讀取用戶在其瀏覽器中輸入的網址。這是我的無障礙服務代碼。Android:使用輔助功能服務閱讀Google Chrome URL

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
android:accessibilityFlags="flagDefault" 
android:accessibilityEventTypes="typeWindowStateChanged" 
android:accessibilityFeedbackType="feedbackGeneric" 
android:notificationTimeout="0" 
android:canRetrieveWindowContent="true" 
android:packageNames="com.android.chrome" 
android:description="@string/accessibility_description" 
/> 

在AndroidManifest

<service android:name=".MyAccessibilityService" 
     android:label="@string/accessibility_title" 
     android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> 
     <intent-filter> 
      <action android:name="android.accessibilityservice.AccessibilityService"/> 
     </intent-filter> 
     <meta-data 
      android:name="android.accessibilityservice" 
      android:resource="@xml/accessibility_service_config" /> 
    </service> 

在MyAccessibilityService

public void onAccessibilityEvent(AccessibilityEvent event) { 
    debug("On accessibility event"); 
    getChromeUrl(getRootInActiveWindow()); 
} 

public void getChromeUrl(AccessibilityNodeInfo nodeInfo) { 
    //Use the node info tree to identify the proper content. 
    //For now we'll just log it to logcat. 
    Log.d(TAG, toStringHierarchy(nodeInfo, 0)); 
} 
private String toStringHierarchy(AccessibilityNodeInfo info, int depth) { 
    if (info == null) return ""; 

    String result = "|"; 
    for (int i = 0; i < depth; i++) { 
     if (result.contains("http")) { 
      Log.d(TAG, "Found URL!!!!!!!!!!!!!!" + result); 
     } 
     result += " "; 
    } 

    result += info.toString(); 

    for (int i = 0; i < info.getChildCount(); i++) { 
     result += "\n" + toStringHierarchy(info.getChild(i), depth + 1); 
    } 

    return result; 
} 
private static void debug(Object object) { 
    Log.d(TAG, object.toString()); 
} 

問題是我收到的網址從內容的看法在我rootview,不上頭地址欄中。任何幫助表示讚賞。

回答

0

嗯。您的代碼或多或少適用於我(儘管我使用不同的accessibility_service_config.xml設置,請參閱下文..),只要Chrome處於活動狀態並且地址欄實際顯示 - 我注意到的一個問題是Chrome會自動隱藏地址欄,只要您開始與頁面進行交互,並且我一直無法找到從Chrome獲取URL地址的方法。出於調試/開發的目的,直到找出最適合您的解決方案,您可能需要將您的某些accessibility_service_config.xml設置更改爲更一般化,確保您啓動該項目並獲取所有可能的輔助功能事件...以下是我使用的是什麼:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:description="@string/accessibility_service_description" 
    android:accessibilityEventTypes="typeAllMask" 
    android:accessibilityFlags="flagDefault" 
    android:accessibilityFeedbackType="feedbackAllMask" 
    android:notificationTimeout="0" 
    android:canRetrieveWindowContent="true" 
    android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity" 
    android:canRequestFilterKeyEvents="true" /> 

  1. 省略了 「機器人:packageNames」 的不同標籤(使其默認爲 「所有」)

  2. 使用最多的屬L個可能爲Android設置:accessibilityEventTypes和android:accessibilityFeedbackType(不知道,但你使用 「typeWindowStateChanged」 爲Android:accessibilityEventTypes可能是你的問題的一部分)

  3. 另外的android:canRequestFilterKeyEvents = 「真」

祝你好運。

1

我用

android:accessibilityFlags="flagDefault|flagIncludeNotImportantViews|flagRequestTouchExplorationMode|flagRequestEnhancedWebAccessibility|flagReportViewIds|flagRetrieveInteractiveWindows" 

我聽的Windows更改事件

public void onAccessibilityEvent(AccessibilityEvent event) { 
    if(AccessibilityEvent.eventTypeToString(event.getEventType()).contains("WINDOW")){ 
     AccessibilityNodeInfo nodeInfo = event.getSource(); 
     dfs(nodeInfo); 
    } 
} 

public void dfs(AccessibilityNodeInfo info){ 
    if(info == null) 
     return; 
    if(info.getText() != null && info.getText().length() > 0) 
     System.out.println(info.getText() + " class: "+info.getClassName()); 
    for(int i=0;i<info.getChildCount();i++){ 
     AccessibilityNodeInfo child = info.getChild(i); 
     dfs(child); 
     child.recycle(); 
    } 
} 

和它的作品!

+2

回收您訪問的孩子是一個好主意:'AccessibilityNodeInfo child = info.getChild(i); DFS(孩子); child.recycle();' – Ishamael

+0

@Ishamael:謝謝你。更新 – cegprakash

+0

@cegprakash有沒有辦法改變網址並將Chrome重定向到不同的頁面?你可以幫助這個鏈接:https://stackoverflow.com/questions/42731897/redirect-chrome-programmatically – kash

-1

可以使用下面的代碼以編程方式更改URL。

AccessibilityNodeInfo source = accessibilityEvent.getSource(); 
      if (source != null & 
"android.widget.EditText".equals(accessibilityEvent.getClassName())) { 
       Bundle arguments = new Bundle(); 

       String typedDetails = source.getText().toString(); 

       Log.d("typed text", source.getText().toString()); 

       if (typedDetails.contains("facebook")) { 
        //showOverlay(); 
//     } 
        arguments.putCharSequence(AccessibilityNodeInfo 
          .ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, 
"file:///android_asset/redirect.html"); 
        final AccessibilityNodeInfo clickableParent = 
source.getParent(); 

        try { 
         Thread.sleep(5000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 

source.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments); 

source.performAction(AccessibilityNodeInfo.ACTION_CLICK); 
       } 
      } 
     } 

使用AccessibilityNodeInfo.ACTION_SET_TEXT 我也在努力進行點擊,你可以使用 AccessibilityNodeInfo.ACTION_CLICK下面的代碼中看到的,但它不工作。想知道是否有可能做到這一點? 謝謝