Work/Android

접근성(AccessibilityService) 서비스를 이용한 Notification Capture 방법

kevin. 2013. 5. 30. 12:24

안드로이드에서 접근성 서비스를 사용하면 Notification을 캡쳐할 수 있다.
 
해놓고 보면 굉장히 간단한데.. 알아내기 까지 많은 시간이 걸렸다.
 
혹시 필요로 하는 사람이 있을지도 몰라 이렇게 간단히나마 정리해두려한다.
 

1. AndroidManifest

- 아래 소스에서 <span> 부분을 제외하고 사용해야 한다. span은 내가 넣지도 않았는데 자꾸 생긴다 ㅡㅡ;

### xml

<service android:name="접근성 이벤트 발생 시 실행되는 클래스(AccessibilityService를 Extends한 클래스)의 패키지 포함 클래스 명"
         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>

 

2. /res/xml/accessibility_service_config.xml

### xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
 android:label="@string/accessibility_service_description"   
 android:description="@string/accessibility_service_description_desc"       
 android:canRetrieveWindowContent="true"   
 android:enabled="true"   
 android:exported="false"        
 android:accessibilityFlags="flagDefault"   
 android:accessibilityEventTypes="typeNotificationStateChanged"   
 android:accessibilityFeedbackType="feedbackAllMask"   
 android:notificationTimeout="100"   
 android:packageNames="@null"/>

 

3. Notification을 잡았을 때 호출되는 Class 소스
 
    http://developer.android.com/guide/topics/ui/accessibility/services.html 중 AccessibilityService를 Extends 하는 소스를 참고하여 작성한다.
 


사실 처음부터 이렇게 하는걸 알고는 있었는데.. res/xml 밑에 xml 하나 더 만드는게 귀찮아서 Manifest에다가 모조리 적었다. 
그랬더니 개발하면서 앱을 덮어서 설치하던가 디바이스를 껐다가 키면 접근성 서비스는 On이 되어 있는데..  
이벤트를 받지 못하는 상황이 발생했다. 거의 이주일 동안 해법을 찾아보았는데..  
결국 https://code.google.com/p/android/issues/detail?id=33934 여기에서 발견했다. 
 

Not a bug, just a PITA to make it work for both pre-JB and JB API level. JB needs an XML config referred from a manifest. The docs may not be clear enough that it is obligatory, but it is. Without it after reboot or app upgrade the intents will not be delivered. http://developer.android.com/guide/topics/ui/accessibility/services.html
 
/res/xml/accessibility_service_config.xml 

그건 버그가 아니고 젤리빈 이전과 이후를 모두 동작하도록 하기 위해서 xml config 파일을 두어야 한다는 것.

즉, Manifest에 다 때려 넣으면 안된다는 것.
 
진작부터 안드로이드 사이트(위에 3번의 링크)에서는 분리하여 만들라고 되어있다.
 

 

교훈. 시키는데로 하자.

'Work > Android' 카테고리의 다른 글

APK 생성 시 Lint Error... 라고 나올 때  (0) 2015.10.06