안드로이드 Notification Listener Service


안드로이드 4.3(API 18)부터 NotificationListenerService가 생겼다. 노티피케이션을 모두 읽어 오거나 지워지거나 삭제됨을 Listener를 통해 콜백받을 수 있다. 사용법은 굉장히 쉽다. 특별히 리시버를 등록한다던가의 작업없이 NotificationListenerService를 상속받아서 구현하면 된다.

public class SimpleKitkatNotificationListener extends NotificationListenerService {

  @Override
  public void onNotificationPosted(StatusBarNotification sbn) {
    //..............
  }

  @Override
  public void onNotificationRemoved(StatusBarNotification sbn) {
    //..............
  }
}

이 서비스를 실행하기위해서는 서비스와 마찬가지로 안드로이드 메니페스트에 등록을 해야한다.

이렇게 메니페스트에 등록이 되었다고 해서 읽을 수 없다. 노티피케이션을 보안과 관련된 민감한 정보들이 많기 때문에 사용자가 직접 해당앱에 대해서 읽을 권한을 주어야한다. 환경설정 > 보안 > Notification Access에서 노티피케이션을 읽을 권한을 주겠다는 앱들에 대해서만 작동한다.

노티피케이션 액세스 설정으로 바로가기 위해서는 아래와 같이 Intent를 통해 사용자에게 도움을 줄 수있다.

Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
startActivity(intent);

노티피케이션은 Notification.extras에 Bundle로 들어오게 되는데 아래 키를 통해 필요한 데이터를 읽으면 된다.

Bundle[
{android.title=Gabriele Mariotti,
  android.subText=null,
  android.showChronometer=false,
  android.icon=2130838949,
  android.text=Send a message with Hangouts,
  android.progress=0,
  android.progressMax=0,
  android.showWhen=true,
  android.largeIcon=android.graphics.Bitmap@42075010,
  android.infoText=null,
  android.progressIndeterminate=false,
  android.scoreModified=false}]
public static final String EXTRA_TITLE = "android.title";
public static final String EXTRA_TEXT = "android.text";
public static final String EXTRA_SUB_TEXT = "android.subText";
public static final String EXTRA_LARGE_ICON = "android.largeIcon";

Notification mNotification=sbn.getNotification();
Bundle extras = mNotification.extras;

String notificationTitle = extras.getString(Notification.EXTRA_TITLE);
int notificationIcon = extras.getInt(Notification.EXTRA_SMALL_ICON);
Bitmap notificationLargeIcon = ((Bitmap) extras.getParcelable(Notification.EXTRA_LARGE_ICON));
CharSequence notificationText = extras.getCharSequence(Notification.EXTRA_TEXT);
CharSequence notificationSubText = extras.getCharSequence(Notification.EXTRA_SUB_TEXT);

모든 Notification 읽기

for(StatusBarNotification sbn : NotificationService.this.getActiveNotifications()){
  Notification mNotification=sbn.getNotification();
}

Android NotificationListenerService를 이용하면 다양한 재미있는 탭을 만들 수 있다. Facebook Home같은 경우 락스크린에  노티피케이션을 읽어서 전혀다른 UI를 만들어서 보여준다.

나의 경우에도 Traffic Wear앱에서 적용하였다.