[Android] AccessibilityService
설정에서 접근성을 체크하면 터치, 키보드 입력 등의 다양한 이벤트를 수신할 수 있다.
- 노티 영역에 수집되는 정보를 추출 가능 (카톡 등과 같은 메신저 미리보기 서비스 이용하여 메시지 캐치가 가능)
- 검색어등 사용자 입력 값 추출 가능
[AndroidManifest.xml]
<service android:name=".AccessService">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data android:name="android.accessibliityservice" android:resource="@xml/accessibility_service_config"/>
</service>
[res/xml]
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:packageNames="com.nhn.android.search" // 이벤트 수집하고 싶은 패키지 명
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:settingsActivity="com.example.accesstest.MainActivity"
android:canRetrieveWindowContent="true"
/>
[src]
public class AccessService extends AccessibilityService{
String inputText = null;
int prevEvent = 0;
//private static final String[] PACKAGE_NAMES = new String[] { };
@Override
public void onAccessibilityEvent(AccessibilityEvent arg0) {
// TODO Auto-generated method stub
Log.d("TEST", "Catch Event : " + arg0.toString());
아래와 같은 이벤트, 값들을 수집 가능.
AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED
AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED
AccessibilityEvent.TYPE_VIEW_CLICKED
arg0.getPackageName() == "com.kakao.talk"
inputText = arg0.getText().toString();
}
@Override
public void onInterrupt() {
// TODO Auto-generated method stub
Log.d("TEST", "OnInterrupt");
}
public void onServiceConnected() {
Log.d("TEST", "onServiceConnected!!");
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
// We are interested in all types of accessibility events.
info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
// We want to provide specific type of feedback.
info.feedbackType = AccessibilityServiceInfo.DEFAULT | AccessibilityServiceInfo.FEEDBACK_HAPTIC;
// We want to receive events in a certain interval.
info.notificationTimeout = 100;
// We want to receive accessibility events only from certain packages.
// info.packageNames = PACKAGE_NAMES;
setServiceInfo(info);
}
}
[출처] 접근성(Accessibility Service)|작성자 Nina