2016-08-05 3 views
3

자신의 브라우저에 입력 한 URL을 읽고 싶습니다. 다음은 내 접근성 서비스 코드입니다. MyAccessibilityService에서 AndroidManifest를Android : 접근성 서비스를 사용하여 Google 크롬 URL을 읽기

<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> 

에서

<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" 
/> 

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 아닌 상단 주소 표시 줄에 URL의 내용에서보기를 얻고있다. 어떤 도움을 주셔서 감사합니다.

답변

0

흠. Chrome이 활성화되어 있고 주소 표시 줄이 실제로 표시되어있는 한 다른 코드 (예 : 다른 accessibility_service_config.xml 설정을 사용하고 있습니다.)를 사용하더라도 코드가 다소 효과적입니다. 크롬에서 자동으로 발견되는 문제는 페이지와 상호 작용을 시작하자마자 주소 표시 줄을 숨기고 Chrome에서 URL 주소를 가져 오는 방법을 찾지 못했습니다. 디버깅/개발 목적으로 가장 적합한 솔루션을 찾을 때까지 accessibility_service_config.xml 설정 중 일부를 좀 더 일반적인 것으로 변경하고 가능한 모든 접근성 이벤트를 가져와이 프로젝트를 시작하도록 할 수 있습니다 ... 여기에 내가 사용하고있는 작업은 다음과 같습니다은 "안드로이드 : PackageNames은"생략

  1. 되는

    <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" /> 
    

    차이 라벨 (기본값으로 발생하는 "모든")

  2. 가장 속을 사용하여 L 가능한 안드로이드에 대한 설정 : accessibilityEventTypes 및 안드로이드 : accessibilityFeedbackType (확실하지만 안드로이드는 "typeWindowStateChanged"를 사용하지? accessibilityEventTypes은 문제의 일부가 될 수 있음) 안드로이드의

  3. 또한 : canRequestFilterKeyEvents

  4. = "true"로

행운을 빈다.

1

나는

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

를 사용하고 난 윈도우 변경된 이벤트

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가 URL을 변경하고 크롬을 다른 페이지로 리디렉션하는 방법이 있습니까?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_CLICK를 사용하여 아래 코드에서 볼 수 있듯이 클릭을 수행하려고하지만 그것은 작동하지 않습니다 AccessibilityNodeInfo.ACTION_SET_TEXT 사용. 그것조차 할 수 있는지 알고 싶습니까 ?? 감사합니다.