안드로이드

[Android] AccessibilityService

SojuMan 2013. 5. 9. 21:41

설정에서 접근성을 체크하면 터치, 키보드 입력 등의 다양한 이벤트를 수신할 수 있다.

- 노티 영역에 수집되는 정보를 추출 가능 (카톡 등과 같은 메신저 미리보기 서비스 이용하여 메시지 캐치가 가능)

- 검색어등 사용자 입력 값 추출 가능

[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);

}

}



[접근성 설정 여부 확인 방법]

AccessibilityManager accessibilityManager = (AccessibilityManager) getSystemService(Service.ACCESSIBILITY_SERVICE);
List<ServiceInfo> installedServices = accessibilityManager.getAccessibilityServiceList();
for (int i = 0, count = installedServices.size(); i < count; ++i) {
ServiceInfo serviceInfo = installedServices.get(i);
String key = serviceInfo.packageName + "/" + serviceInfo.name;


[접근성 설정 코드]

설정 코드는 정상이나 권한이 없어서 설정 에러가 난다.
final HashSet<String> enabled = new HashSet<String>();
String settingValue = Settings.Secure.getString(getContentResolver(),
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
if (settingValue != null) {
TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
splitter.setString(settingValue);
while (splitter.hasNext()) {
enabled.add(splitter.next());
Log.d("TEST", "splitter.next() : " + settingValue);
}
}
StringBuilder builder = new StringBuilder(256);
builder.append("com.example.accesstest");
builder.append(":");