NotificatioinManagerからは現在の通知を取得できないが、AccessibilityServiceを使用すれば他のアプリケーションから通知されるNotifycationをイベントとして取得できる。
▼ステータスバー通知 Notification / NotificationManager の特徴
・NotificationMaganerにNotificationを追加するとステータスバーに通知される
・NotificationにはViewを指定できる
・NofiticationManagerでは追加/上書/削除のみを行える
他アプリの通知を取得できないように制限されている。
▼ユーザ補助サービス AccessibilityServiceの特徴
・他アプリでの操作の一部や通知内容の一部を取得できる
・テキスト入力内容まで取得できてしまうため安易に利用できない
・通常のアプリケーションとは別に設定→ユーザ補助からサービスを許可/実行する必要がある
▼AccessibilityServiceのサンプルコード
・必要最低限のサンプルコード (理解には最良のサンプル)
・本家と和訳サイト
・Android 3.2で実装したところ、Toastも Notificationとして受け取って自己ループに陥ったので修正
▼AccessibilityServiceからの受け渡し
・SharedPreferencesを介してStringで受け渡す例 (抜粋)
サービスとの通信が不要で、ユーザ補助のON/OFF切り替えを認識せずに受信可能。
public class StrAccessibilityService extends AccessibilityService {
public static final String SHARED_ACCESS_PREFS="str_access";
public static final String ACCESS_PREFS_KEY="access_key";
private SharedPreferences mPrefAccess;
public static final boolean DEBUG=true; // 通知のToast表示フラグ
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onServiceConnected() {
mPrefAccess = getSharedPreferences(SHARED_ACCESS_PREFS, MODE_PRIVATE);
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
info.notificationTimeout = NOTIFICATION_TIMEOUT_MILLIS;
info.flags = AccessibilityServiceInfo.DEFAULT;
setServiceInfo(info);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
switch (eventType) {
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED :
if(DEBUG) Log.d("StrAccessibilityService", "Access NOTIFIFY:"+event.getText());
putPreferences(event);
break;
}
}
private void putPreferences(AccessibilityEvent event){// Preferenceを変更
SharedPreferences.Editor editor = mPrefAccess.edit();
editor.putString(ACCESS_PREFS_KEY, ""+event.getText());
editor.commit();
}
}
取得側クラスは SharedPreferences.OnSharedPreferenceChangeListener を implement し、 onSharedPreferenceChanged で取得する。
public static final String SHARED_ACCESS_PREFS="str_access";
public static final String ACCESS_PREFS_KEY="access_key";
private SharedPreferences mPrefAccess;
@Override
public void onCreate() {
super.onCreate();
mPrefAccess = getSharedPreferences(SHARED_ACCESS_PREFS, MODE_PRIVATE);
mPrefAccess.registerOnSharedPreferenceChangeListener(this);
}
@Override // StrAccessibilityService#putPreferencesによりコールされる
public void onSharedPreferenceChanged(SharedPreferences prefs,String key) {
String access_text = prefs.getString(ACCESS_PREFS_KEY,null);
// (ここから処理)
}