2017-10-14 8 views
0

docServiceInfo 에 대한 인용 "이 메소드는 언제든지 호출 할 수 있지만 시스템이이 서비스에 바인드 된 후 정보가 수집되고이 메소드가 그 후 전화했다. "AccessibilityService 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. 
} 

편집 :

당신은 당신의 서비스 정보 물건 몇 가지 문제가 있습니다. 이 라인을 수행 할 때 :

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

당신은 당신의 service_config.xml 파일의 모든 정보뿐만 아니라 당신이 거기에 설정하지 않은 모든 디폴트 값을 덮어 씁니다. service_config.xml에서 정적 초기화를 처리하고 가져온 serviceInfo 객체를 수정하여 동적 변경 만 수행하도록해야합니다. 또는 최소한 서비스 구성에서 작성된 것을 가져 오십시오. 이에 줄

변경 :

//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를 사용하여 설정 한 두 패키지 "packageA"및 "packageB"에 대한 이벤트를 수신하려고합니다. 나중에 특정 이벤트를 수신 한 후에 packageB를 "제외"하고 packageA에서 이벤트 만 원합니다.이제 패키지 A를 포함하고 setServiceInfo를 다시 호출하도록 packageNames 배열을 수정하지만 packageB.I의 이벤트를 여전히받습니다. 현재 제안 된 방법을 사용하고 있지만 packageB에서 이벤트 수신을 귀찮게하고 왜 PackageB를 구독 취소 할 수 있는지 반환합니다. . –

+0

모호성을 피하기 위해 질문을 편집했습니다. –

+0

코드에서 하나의 "if"문을 제거하는 데이 모든 문제가 발생합니까? 따라서, 제시 한 코드에는 아무런 문제가 없습니다. 모두 가설 적으로 작동해야하므로, 코드 또는 Android의 다른 곳에 버그가 있습니다. 처음에는 서비스 정보 초기화에 대해 논평하고 손을 흔들어 보면서 코드를 보려합니다. 즉, 이것은 분명히이 API의 비표준적인 사용이므로 안드로이드에서 버그를 발견했을 수도 있다는 사실을 할인하지 마십시오. – ChrisCM