#目的
通知のイベントを監視して、通知内容をアプリで利用したい。
#セキュリティ・通知アクセス
アプリから通知内容を取得するには、セキュリティ → 通知アクセス →、アプリにチェックを付ける必要がある。プログラムからその画面を起動することも出来る。
private void showNotificationAccessSettingMenu() {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
startActivity(intent);
}
自分のアプリが通知内容を取得することが可能なのか確認
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;
}
例
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!isEnabledReadNotification()) {
showNotificationAccessSettingMenu();
} else {
}
NotificationListenerService( Android4.3 ~ )
NotificationListenerServiceを継承すれば、通知のイベントを監視して、通知内容を取得することが可能。
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) {
//通知が削除
}
}
##サービスなので宣言が必要
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
通知に表示されている内容をすべて取得する。
@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);
}
}