2017-09-28 11 views
2

AccessibilityService가 정상적으로 작동했지만 개발 중에 어떤 이유로 작동을 멈췄습니다. 나는 그 이유를 찾지 못하는 것 같습니다. 내 코드를보고 왜 작동하지 않는지 말해주십시오.android Accessibility-service가 갑자기 이벤트 트리거링을 중지했습니다.

public class MyServicee extends AccessibilityService { 

public static final String TAG = "volumeMaster"; 

@TargetApi(Build.VERSION_CODES.KITKAT) 
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) 
@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 

    List<CharSequence> eventText; 

    Log.v(TAG, "***** onAccessibilityEvent"); 

    final int eventType = event.getEventType(); 

    switch (eventType) { 

     case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: 

      break; 
    } 

    if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED) { 

    } 



} 

private String processUSSDText(List<CharSequence> eventText) { 
    for (CharSequence s : eventText) { 
     String text = String.valueOf(s); 
     if (true) { 
      return text; 
     } 
    } 
    return null; 
} 

@Override 
public void onInterrupt() { 
    Log.v(TAG, "***** onInterrupt"); 
} 


@TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
@Override 
public void onServiceConnected() { 
    Log.v(TAG, "***** onServiceConnected"); 

    AccessibilityServiceInfo info = getServiceInfo(); 
    info.eventTypes = 
      AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED 
        | AccessibilityEvent.TYPE_VIEW_CLICKED 
        | AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; 

    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; 
    info.packageNames = new String[]{"com.whatsapp"}; 
    info.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; 
    setServiceInfo(info); 
    super.onServiceConnected(); 
} 

} 

여기 매니페스트의 관련 부분 :

<accessibility-service 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:accessibilityEventTypes="typeViewClicked|typeNotificationStateChanged|typeWindowStateChanged" 
android:accessibilityFeedbackType="feedbackAllMask" 
android:canRetrieveWindowContent="true" 
android:accessibilityFlags="flagIncludeNotImportantViews|flagRequestFilterKeyEvents" 
android:notificationTimeout="1" 
android:packageNames="com.whatsapp" 
android:settingsActivity="@string/app_name" /> 

코드는 사용자가 통화 녹음 서비스를 시작했을 때 검색을 시도 :

<service android:name=".MyServicee" 
     android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" 
     android:enabled="true"> 
     <intent-filter> 
      <action android:name="android.accessibilityservice.AccessibilityService" /> 
     </intent-filter> 
     <meta-data android:name="android.accessibilityservice" 
      android:resource="@xml/myservice" /> 
    </service> 

여기 myserviceconfig.xml입니다. 당신은 시스템 구축 접근성 정보를 덮어, 당신의 onServiceConnected 기능에

첫째 :

답변

0

은 구성에 몇 가지 문제가 있습니다.

AccessibilityServiceInfo info = getServiceInfo(); 
info.eventTypes = 
     AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED 
       | AccessibilityEvent.TYPE_VIEW_CLICKED 
       | AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; 

info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; 
info.packageNames = new String[]{"com.whatsapp"}; 
info.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; 
setServiceInfo(info); 
super.onServiceConnected(); 

이 전체 코드 블록은 불필요하며 serviceConfig XML 파일의 유사한 행에 의해 수행됩니다. 그냥 생략하면된다. 생략 할 수 없다면 설정에 문제가있다.

지금, 당신의 service_config XML 파일을 댄다 말하기 자체에 대한 이야기, 이제 여기에 몇 줄에 대해 이야기하자 :

android:notificationTimeout="1" 

한 MS의 알림 시간 제한은 본질적으로 가치가있다.

android:packageNames="com.whatsapp" 

정말로 액세스 가능성 이벤트를 하나의 응용 프로그램으로 제한 하시겠습니까?

android:settingsActivity="@string/app_name" 

이것은 settingsActivity 속성에 대한 절대적으로 잘못된 값입니다. 설정 활동은 응용 프로그램 내의 활동 클래스 이름이어야합니다. 예 : com.yourpackage.SettingsActivity. 이 속성은 안전하게 생략 할 수 있습니다.

이 정보 외에도 완전히 새로운 상태의 접근성 서비스를 얻는 것은 매우 쉽습니다. 백그라운드에서 실행되는 데몬 서비스를 시작하여 서비스 양식을 시작하지만 실제로 생산적인 일은하지 마십시오. 이 문제를 해결할 수있는 유일한 방법은 기기를 다시 시작하는 것입니다. 때로는 패키지를 제거한 다음 장치를 다시 시작한 다음 패키지를 다시 설치해야 할 때도 있습니다.

+0

당신의 재연에 감사드립니다 ..... @ Chris CM .........하지만 문제는 코드가 예외를 throw하면 서비스가 불행히도 멈추고 12 초 후에 완벽하게 작동합니다. 그래서 나에게 약간의 제안을해라. – Secret

+0

서비스가 예외를 throw하는 경우 질문과 함께 스택 추적을 게시해야합니다. 스택 추적보다 문제를 디버깅하는 데 도움이되는 정보는 없습니다. – ChrisCM