2017-10-14 13 views
0

docServiceInfo "このメソッドはいつでも呼び出すことができますが、システムがこのサービスにバインドされた後にこのメソッドを呼び出すことができます。その後呼ばれる。アクセシビリティサービスのsetServiceInfoメソッドの変更がonServiceConnectedの外で有効にならないようです

アクセシビリティは、私のアプリのために有効になっていると私はonServiceConnectedメソッド内SERVICEINFOを設定していると私はそれらのアプリケーションのためのイベントを受け付けておりますし、すべてが順調です。

問題は、onServiceConnectedメソッドの外でsetServiceInfoを呼び出すことによってパッケージリストを変更しようとしていますが、変更が有効になっていません(つまり、以前に指定したパッケージリストのパッケージからイベントを受け取ります変更されたパッケージリストには存在しません)。

@Override 
protected void onServiceConnected() { 
    AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo(); 
    accessibilityServiceInfo.packageNames = new String[]{"packageA","packageB"}; 
    accessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED | AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 
      | AccessibilityEvent.TYPE_VIEW_SCROLLED | AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED 
      | AccessibilityEvent.TYPE_VIEW_FOCUSED | AccessibilityEvent.TYPE_VIEW_SELECTED 
      | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED; 
    accessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; 
    accessibilityServiceInfo.notificationTimeout = 100; 
    accessibilityServiceInfo.flags = (AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS | accessibilityServiceInfo.flags); 
    setServiceInfo(accessibilityServiceInfo); 
} 

@Override 
public void onAccessibilityEvent(final AccessibilityEvent event) { 
    AccessibilityServiceInfo serviceInfo = getServiceInfo(); 
    serviceInfo.packageNames = new String[]{"packageA"}; 
    setServiceInfo(serviceInfo); 
} 

accessibility_service_config.xml

<accessibility-service 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:canRetrieveWindowContent="true" 
    android:description="@string/accessibility_service_description" 
/> 

だから、質問は私が後で受信アクセシビリティイベントに応じて、アクセスサービス内のパッケージを削除/追加するにはどうすればよいのですか?

答えて

1

あなたはそのリストに追加することによって、パッケージ名を除外することはできません。

serviceInfo.packageNames = null 

すべてのパッケージのイベントを取得します。

serviceInfo.packageNames = {"some.package"} 

some.packageのイベントのみを取得します。このリストは除外項目ではなく、含まれるもののリストです。

ここで、イベントを取得するすべてのパッケージのリストを保持できる場合は、これを行うことができます。サービス情報を動的に設定することはちょうどいいです!しかし、TBHは、あなたがこのAPIにその意図した方法を使用して、この方法はあまりにも困難にしていません。あなたが唯一のいくつかのことを除外したい場合は、非常に悪く、そのイベントを取得するために、世界で他のすべてのパッケージ名のリストを保存することをお勧めします。あなた自身のロジックフィルタパッケージ名が必要なのは私のようです。私の代わりにこれをしようとするだろう:

@Override 
public void onAccessibilityEvent(AccessibilityEvent e) { 

    //Do the filtering yourself. 
    ArrayList<String> includedPackageNames = youlist; 

    if (!includedPackageNames.contains(e.getPackageName())) return; 

    //Do the rest of your stuff here. 
} 

EDIT:

あなたはあなたのサービス情報のものといくつかの問題があります。あなたはこの行を行うと:

@Override 
protected void onServiceConnected() { 
    AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo(); //This one! 
    ... 
} 

あなたのservice_config.xmlファイル内のすべての情報だけでなく、あなたがそこに設定していない任意のデフォルト値を上書きします。 service_config.xmlは静的初期化を処理し、フェッチされたserviceInfoオブジェクトを変更することによってのみ動的に変更する必要があります。 OR、非常に少なくとも、あなたのサービスの設定から構築されたものを取り出します。このためにライン

変更:

//Get the object that has been initialized with settings from your service_config.xml file 
AccessibilityServiceInfo accessibilityServiceInfo = getServiceInfo(); 

OR、いっそ、あなたの全体のonServiceConnected機能を削除して、あなたのservice_config.xmlファイルで静的にそれをすべて行います。

+0

おそらく私は "除外"と言ったときにはっきりしませんでした。私は説明してください。最初にonServiceConnectedのsetServiceInfoを使って設定した2つのパッケージ "packageA"と "packageB"のイベントを受け取ります。後で特定のイベントを受け取った後、私はpackageBを「除外」したいだけで、packageAからのイベントを必要とします。今度はpackageNames配列を修正してsetServiceInfoを再度呼び出すようにしましたが、packageB.Iからのイベントはまだ受け取りましたが、現在はuを提案していますが、packageBからイベントを受け取るのを邪魔してしまい、 。 –

+0

あいまいさを避けるために質問を編集しました。 –

+0

コードから1つの "if"ステートメントを削除すると、このような問題が発生しますか?したがって、あなたが提示したコードには何も問題はありません。それはすべて仮想的に動くはずだから、あなたのコードのどこかに、あるいはAndroidにバグがあります。私はあなたが最初にあなたのサービス情報を初期化することについてコメントして手を振ることによって、あなたが省略したコードを見ることに興味があります。つまり、これは間違いなくこのAPIの非標準的な使い方なので、あなたがAndroidにバグを見つけた可能性があるという事実を割り引かないでください。 – ChrisCM

関連する問題