AccessibilityServiceを古いAndroidバージョンで動かす

2013-09-08T00:00:00+00:00 Android Java

android.accessibilityservice.AccessibilityServiceを使用してNotificationを取得するをAndroid4.x以下(3.x系を除く)な2.x系で動かす場合、<meta-data>によるAccessibityServiceInfoの構築?はサポートされてない模様。

という事でやってみた

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="sample.test"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <service
            android:name=".SampleService"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>
        </service>
    </application>
</manifest>

<meta-data>を指定しない

SampleService.java

package sample.test;

import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.Notification;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.widget.RemoteViews;
import android.widget.TextView;

public class SampleService extends AccessibilityService {

    private static final String TAG = SampleService.class.getName();

    // onServiceConnectedにてAccessibilityServiceInfoの構築を行う
    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        Log.v("test", "onServiceConnected");

        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
        info.feedbackType = AccessibilityEvent.TYPES_ALL_MASK;
        setServiceInfo(info);
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        if (event.getEventType() != AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED)
            return;

        Notification n = (Notification)event.getParcelableData();

        if (n == null)
            return;

        RemoteViews rv = n.contentView;
        View view = rv.apply(this, null);

        if (view == null)
            return;

        if (view instanceof ViewGroup) {
            ViewGroup group = (ViewGroup)view;
            searchTextView(group);
        }
    }

    @Override
    public void onInterrupt() {
    }

    // NotificationなRemoteViewsからTextView(それを継承しているのも含め)取得してテキストをログに出す
    private void searchTextView(ViewGroup group) {
        int count = group.getChildCount();

        for (int i = 0; i < count; i++) {
            View v = group.getChildAt(i);

            if (v instanceof TextView) {
                Log.v(TAG, "text: " + ((TextView)v).getText());
            } else if(v instanceof ViewGroup) {
                searchTextView((ViewGroup)v);
            }
        }
    }
}

っていう事。要は

っていう事。ちなみに

っていうのもあるのでそれもあわせて

追記

http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html#SERVICE_META_DATA

によるとで指定出来るのはAPI Level 14かららしい

angular.jsのkarmaを使ったテスト oauth-signpost(Android)でGoogle App Engine(+OAuth)