AccesibilityServiceによるユーザー補助サービスの作り方
自分のアプリだけではなくそのほかのアプリなどのグローバルなイベントを受け取りたいときはAccessibilityServiceを使います。
このクラスはユーザー補助のために作られた特別なServiceクラスです。
その作り方は次の通りです。
- AccessibilityServiceを拡張したサービスクラスを作る
- サービスクラスの設定ファイルを作る
- AndroidManifest.xmlにサービスを追加する
- 端末で「設定」から「ユーザー補助」を選びサービスを有効にする
AccessibilityServiceを拡張したクラスの作成
AccessibilityServiceはServiceを拡張して作られていますが違う点がいくつかあります。それは次のような点です。
- onBindメソッドがfinalなのでオーバーライドできない
- onAccessibilityEventメソッドでイベントを受け取る
このような違いがあります。これを踏まえて次のようなサービス(MyAccessibilityService)を作ります。
public class MyAccessibilityService extends AccessibilityService { private static final String LOG_TAG = "MyAccessibilityService"; @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); } /**システムで起こったイベントを受け取る*/ @Override public void onAccessibilityEvent(AccessibilityEvent event) { Log.i(LOG_TAG, "イベント = " + event.getEventType()); Log.i(LOG_TAG, "パッケージ名 = " + event.getPackageName()); Log.i(LOG_TAG, "クラス名 = " + event.getClassName()); } @Override public void onInterrupt() { //サービスが中断されたときの処理 } }
onAccessibilityEventメソッドで受け取ったAccessibilityEventからどのようなイベントが起こったのか取得できます。ここではイベントの種類とイベントを起こしたアプリのパッケージ名とそのクラス名を取得しています。
設定ファイルの作成
次にres/xmlフォルダ(なければ作ります)以下にこのサービスの設定ファイルを作ります。たとえばaccessibility_config.xmlのような名前で次のようなxmlファイルを作るとします。
accessibility_config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:description="@string/accessibility_desciription" />
この設定ではすべてのイベントを受け取れるようにしています。受け取れるイベントの種類はaccessibilityEventTypes、フィードバックの種類はaccessibilityFeedbackType、フラグについてはaccessibilityFlagsを参照してください。
AndroidManifest.xmlにサービスを追加する
次にAndroidManifest.xmlを開き、作成したサービスが使えるようにします。
<service android:name="com.MyApp.myapp.MyAccessibilityService"
android:label="MyAccessibility"
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/accessibility_config" />
</service>
</application>
</manifest>
service要素内のmeta-dataに設定ファイルを渡しています。
サービスを有効にする
実はこれだけではまだサービスは利用できません。
サービスを有効にするには「設定」アプリから「ユーザー補助」を選び次のように設定をONにします。
これで本当にサービスが有効になったのでクリックやスクロールなどのイベントが起きるたびにそれを受け取って必要な処理をすることが可能になります。