AccesibilityServiceによるユーザー補助サービスの作り方

自分のアプリだけではなくそのほかのアプリなどのグローバルなイベントを受け取りたいときはAccessibilityServiceを使います。

このクラスはユーザー補助のために作られた特別なServiceクラスです。

その作り方は次の通りです。

  1. AccessibilityServiceを拡張したサービスクラスを作る
  2. サービスクラスの設定ファイルを作る
  3. AndroidManifest.xmlにサービスを追加する
  4. 端末で「設定」から「ユーザー補助」を選びサービスを有効にする

AccessibilityServiceを拡張したクラスの作成

AccessibilityServiceServiceを拡張して作られていますが違う点がいくつかあります。それは次のような点です。

このような違いがあります。これを踏まえて次のようなサービス(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にします。

サービスを有効にした画像

これで本当にサービスが有効になったのでクリックやスクロールなどのイベントが起きるたびにそれを受け取って必要な処理をすることが可能になります。

関連項目
プライバシーポリシー