2016-08-05 9 views
3

自分のブラウザにURLを入力してください。ここにアクセシビリティサービスコードがあります。 MyAccessibilityServiceでAndroidManifestAndroid:アクセシビリティサービスを使用してGoogle Chromeの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

Hmm。あなたのコードは多かれ少なかれ私のために働いています(別のaccessibility_service_config.xml設定を使用していますが、下記参照)。Chromeがアクティブでアドレスバーが実際に表示されている限り、ページとのやりとりを開始するとすぐにアドレスバーが非表示になり、ChromeからURLアドレスを取得する方法を見つけることができませんでした。デバッグ/開発の目的で、あなたに最適なソリューションを見つけ出すまで、accessibility_service_config.xmlの設定をより一般的なものに変更し、おそらく可能性のあるすべてのアクセシビリティイベントを取得してこのプロジェクトを開始するようにすることができます...ここで私が使用しているものだ: "アンドロイド:パッケージ名" を省略

  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. 最も一般的な属を使用してリットル可能アンドロイドの設定:accessibilityEventTypesとAndroid:accessibilityFeedbackType(わからないが、あなたは、Android向け "typeWindowStateChanged" を使用して:accessibilityEventTypesはあなたの問題の一部である可能性があります?)アンドロイドの

  3. 追加:

  4. canRequestFilterKeyEvents = "true" を

幸運。

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にはURLを変更してクロムを別のページにリダイレクトする方法がありますか?このリンクで手助けできますか:https://stackoverflow.com/questions/42731897/redirect-chrome-programmatically – kash

-1

URLはプログラムによって次のコードを使用して変更できます。 AccessibilityNodeInfo.ACTION_SET_TEXT を使用して

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を使用して、以下のコードで見ることができるようにクリックを実行しようとしていますが、それは動作しません。それが可能かどうかを知りたいのですか? ありがとう

関連する問題