2015년 5월 9일 토요일

android 현재 Active 된 app 알아내기 (접근성 이용)

앞서 다른 포스트로 ative 된 app을 알아내는 방법을 시도하였는데 L OS 올라오면서 동작이 안되어 삽질을 계속 하고 있었다.

그중 흥미로운 내용이 있었으니 AccessibilityService 서비스를 이용하는 방법이 있었으니, 아주 훌륭하게 동작하였다.

단 하나의 단점은 app을 설치하고, 설정의 접근성 메뉴를 통해서 enable시도를 하여야 한다.
메뉴의 위치는 아래와 같다.
Home Screen > System Settings > Accessibility > Accessibility Services > Toast2 > Change from Off to On,


위의 위치에서 enable해도 되지만 접근성 바로가기를 app에서 지원하게 만들 수도 있다.
Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivityForResult(intent, 0);

테스트에 사용한 코드


public class WindowChangeDetectingService extends AccessibilityService 
{

 @Override
 public void onAccessibilityEvent(AccessibilityEvent event) {
  if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED)
   Log.i("WindowChangeDetectingService",
     "Window Package: " + event.getPackageName());
 }
}

AndroidManifest.xml 에 아래 항목 추가

    <application>
     <service
         android:name=".WindowChangeDetectingService"
         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/accessibilityservice"/>
     </service>
    </application>


xml 파일 추가
Put this in res/xml/accessibilityservice.xml:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    android:accessibilityEventTypes="typeWindowStateChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagIncludeNotImportantViews"
    android:description="@string/app_name"
    android:settingsActivity="your.app.ServiceSettingsActivity"
    xmlns:android="http://schemas.android.com/apk/res/android" />
단 여기 항목중 항목은 자신의 app ativity를 적어 줍니다. 설정시 ui를 제공한다고는 하나 대충 안적어도 동작합니다.
테스트에서는 아래와 같이 하였습니다.


<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    android:accessibilityEventTypes="typeWindowStateChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagIncludeNotImportantViews"
    android:description="@string/app_name"
    android:settingsActivity="com.example.MainActivity"
    xmlns:android="http://schemas.android.com/apk/res/android" />
그리고 해당 service는 시작시킬 필요는 없습니다. enable만 되어있으면 자동으로 동작됩니다.

출처 참고

http://stackoverflow.com/questions/3873659/android-how-can-i-get-the-current-foreground-activity-from-a-service?lq=1

http://stackoverflow.com/questions/11087758/accessibility-service-is-not-started/11203192#11203192

댓글 4개:

  1. 혹시 풀 프로젝트를 볼수있을까요? ㅠㅠ

    답글삭제
    답글
    1. 오래된 프로젝트입니다. 제대로 동작이 될지 모르겠네요.
      https://drive.google.com/open?id=0B9vAKDzHthQIV1pvMkw0OGdNeEE

      삭제
  2. 진짜 몇일째 검색해보고 찾다가 드디어 제가 원하는 부분을 찾았네요 정말 감사합니다 ㅎㅎ

    답글삭제
  3. 감사합니다 많은 도움이 되었습니다

    답글삭제