Прослушайте изменения в настройках уведомлений для приложения - PullRequest
0 голосов
/ 03 апреля 2019

Мое приложение может вызывать некоторые уведомления.

notifications_screen

Я хотел бы иметь возможность определять, когда пользователь изменяет настройку уведомления, дляслучай, когда он отключает их глобально, когда он отключает один канал, или когда он переключает «Разрешить точку уведомления» ...

Я пробовал подход NotificationListenerService :

public class AppNotificationListenerService extends NotificationListenerService {

    private static final String TAG = "AppNLS";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: ");
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind: ");
        return super.onBind(intent);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "onUnbind: ");
        return super.onUnbind(intent);
    }

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {
        super.onNotificationPosted(sbn);
        Log.d(TAG, "onNotificationPosted: ");
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
        super.onNotificationRemoved(sbn);
        Log.d(TAG, "onNotificationRemoved: ");
    }

    @Override
    public void onListenerConnected() {
        super.onListenerConnected();
        Log.d(TAG, "onListenerConnected: ");
    }

    @Override
    public void onListenerDisconnected() {
        super.onListenerDisconnected();
        Log.d(TAG, "onListenerDisconnected: ");
    }

    @Override
    public void onNotificationChannelModified(String pkg, UserHandle user, NotificationChannel channel, int modificationType) {
        super.onNotificationChannelModified(pkg, user, channel, modificationType);
        Log.d(TAG, "onNotificationChannelModified: ");
    }

    @Override
    public void onListenerHintsChanged(int hints) {
        super.onListenerHintsChanged(hints);
        Log.d(TAG, "onListenerHintsChanged: ");
    }

    @Override
    public void onNotificationPosted(StatusBarNotification sbn, RankingMap rankingMap) {
        super.onNotificationPosted(sbn, rankingMap);
        Log.d(TAG, "onNotificationPosted: ");
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap) {
        super.onNotificationRemoved(sbn, rankingMap);
        Log.d(TAG, "onNotificationRemoved: ");
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap, int reason) {
        super.onNotificationRemoved(sbn, rankingMap, reason);
        Log.d(TAG, "onNotificationRemoved: ");
    }

    @Override
    public void onNotificationRankingUpdate(RankingMap rankingMap) {
        super.onNotificationRankingUpdate(rankingMap);
        Log.d(TAG, "onNotificationRankingUpdate: ");
    }

    @Override
    public void onNotificationChannelGroupModified(String pkg, UserHandle user, NotificationChannelGroup group, int modificationType) {
        super.onNotificationChannelGroupModified(pkg, user, group, modificationType);
        Log.d(TAG, "onNotificationChannelGroupModified: ");
    }

    @Override
    public void onInterruptionFilterChanged(int interruptionFilter) {
        super.onInterruptionFilterChanged(interruptionFilter);
        Log.d(TAG, "onInterruptionFilterChanged: ");
    }

}

В манифесте я добавил услугу:

<service android:name=".services.AppNotificationListenerService"
    android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
    <intent-filter>
        <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>
</service>

И я предоставил доступ к уведомлению для моего приложения: access

Услугаправильно создал границу, я вижу onNotificationPosted() и onNotificationRemoved(), когда уведомление отображается / удаляется из области уведомлений.

Однако, когда я включаю / отключаю уведомления для приложения глобально, ни один из методовпозвонить.И когда я включаю / отключаю уведомление о канале, вызывается только метод onNotificationRankingUpdate(), но он вызывается, когда переключаются каналы других приложений.Мне нужно только из моего приложения.

Это правильный путь или то, чего я хочу достичь, сделано по-другому?

1 Ответ

1 голос
/ 03 апреля 2019

Как написано в другом ответе SO , API 28 добавил системные трансляции для ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED и ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED, которые должны соответствовать вашим потребностям ( см. Документацию ).

...