Android(4.4)の通知内容を取得したい。

#目的

通知のイベントを監視して、通知内容をアプリで利用したい。

#セキュリティ・通知アクセス
アプリから通知内容を取得するには、セキュリティ → 通知アクセス →、アプリにチェックを付ける必要がある。プログラムからその画面を起動することも出来る。

```java
 private void showNotificationAccessSettingMenu() {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
        startActivity(intent);
 }
```

## 自分のアプリが通知内容を取得することが可能なのか確認

```java
private boolean isEnabledReadNotification() {
        ContentResolver contentResolver = getContentResolver();
        String rawListeners = Settings.Secure.getString(contentResolver,
                "enabled_notification_listeners");
        if (rawListeners == null || "".equals(rawListeners)) {
            return false;
        } else {
            String[] listeners = rawListeners.split(":");
            for (String listener : listeners) {
                if (listener.startsWith(getPackageName())) {
                    return true;
                }
            }
        }
        return false;
}
```

## 例
```java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (!isEnabledReadNotification()) {
        showNotificationAccessSettingMenu();
    } else {
        
    }
```

## NotificationListenerService( Android4.3 ~ )
NotificationListenerServiceを継承すれば、通知のイベントを監視して、通知内容を取得することが可能。


```java

import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;

import java.util.ArrayList;

public class NotificationService extends NotificationListenerService {

    private String TAG = "Notification";
    
    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {    
        //通知が更新
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
        //通知が削除
    }
}

```

##サービスなので宣言が必要

```xml:AndroidManifest.xml

   <service android:name=".NotificationService"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
            <intent-filter>
                <action android:name=
                    "android.service.notification.NotificationListenerService" />
            </intent-filter>
        </service>
```


## getActiveNotifications
通知に表示されている内容をすべて取得する。

```java

@Override
public void onNotificationPosted(StatusBarNotification sbn) {
    StatusBarNotification[] notifications = getActiveNotifications();
    for (StatusBarNotification object: notifications){
            String package_name = object.getPackageName();
            String post_date = new SimpleDateFormat("yyyy/MM/dd").format(object.getPostTime());
            CharSequence ticket = object.getNotification().tickerText;
            String message;

            if (ticket != null) {
                 message = ticket.toString();
            } else {
                 message = "なし";
            }

            Log.d(TAG, package_name + ":" + post_date + ":" + message);

    }
}

```