AccessibilityServiceを古いAndroidバージョンで動かす
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);
}
}
}
}
っていう事。要は
Android2.2だとmeta-data指定だとイケない。onServiceConnectedでAccessibilityServiceInfoをsetServiceInfoするのが良い
— kinjouj (@kinjou_j) September 8, 2013
っていう事。ちなみに
Android4.xだと4.1までなら問題無いらしいが、それ以降だとandroid.permission.BIND_ACCESSIBILITY_SERVICEを指定してないとユーザー補助機能に出てこない
— kinjouj (@kinjou_j) September 8, 2013
っていうのもあるのでそれもあわせて
追記
によると