web-dev-qa-db-fra.com

Android Oreo Notifications - vérifiez si un canal spécifique est activé

J'utilise cet extrait pour vérifier si les notifications sont activées:

NotificationManagerCompat.from(getContext()).areNotificationsEnabled()

cependant , si l'utilisateur désactive uniquement le canal, je ne peux pas le savoir.

Une idée? enter image description here

19
itzhar

avec compatibilité descendante:

public boolean isNotificationChannelEnabled(Context context, @Nullable String channelId){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            if(!TextUtils.isEmpty(channelId)) {
                NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                NotificationChannel channel = manager.getNotificationChannel(channelId);
                return channel.getImportance() != NotificationManager.IMPORTANCE_NONE;
            }
            return false;
        } else {
            return NotificationManagerCompat.from(context).areNotificationsEnabled();
        }
    }
34
itzhar

Consultez les documents ici .

Les utilisateurs peuvent modifier les paramètres des canaux de notification, y compris des comportements tels que les vibrations et les sons d'alerte. Vous pouvez appeler les deux méthodes suivantes pour découvrir les paramètres qu'un utilisateur a appliqués à un canal de notification:

Pour récupérer un seul canal de notification, vous pouvez appeler getNotificationChannel(). Pour récupérer tous les canaux de notification appartenant à votre application, vous pouvez appeler getNotificationChannels(). Une fois que vous disposez de NotificationChannel, vous pouvez utiliser des méthodes telles que getVibrationPattern() et getSound() pour connaître les paramètres de l'utilisateur. Pour savoir si un utilisateur a bloqué un canal de notification, vous pouvez appeler getImportance(). Si le canal de notification est bloqué, getImportance() renvoie IMPORTANCE_NONE.

16
ditn

Utilisez-le pour vérifier si les notifications globales ou les canaux sont désactivés et amener l'utilisateur aux paramètres correspondants:

Dans la méthode d'appel:

if (!notificationManager.areNotificationsEnabled()) {
        openNotificationSettings();
        return;
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O &&
            isChannelBlocked(CHANNEL_1_ID)) {
        openChannelSettings(CHANNEL_1_ID);
        return;
    }

Dans votre classe:

private void openNotificationSettings() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
        intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
        startActivity(intent);
    } else {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivity(intent);
    }
}

@RequiresApi(26)
private boolean isChannelBlocked(String channelId) {
    NotificationManager manager = getSystemService(NotificationManager.class);
    NotificationChannel channel = manager.getNotificationChannel(channelId);

    return channel != null &&
            channel.getImportance() == NotificationManager.IMPORTANCE_NONE;
}

@RequiresApi(26)
private void openChannelSettings(String channelId) {
    Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
    intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
    intent.putExtra(Settings.EXTRA_CHANNEL_ID, channelId);
    startActivity(intent);
}
5
Florian Walther

Je pense que l'exemple de @itzhar a un défaut: lorsque l'utilisateur a complètement désactivé les notifications dans l'application, nous pouvons obtenir un faux positif (lorsque le canal lui-même n'a pas été désactivé).

Le code mis à jour (dans Kotlin) peut ressembler à:

fun isNotificationAllowed(context: Context): Boolean {
    return if (isOOrLater()) {
        areNotificationsEnabled(context) and isChannelDisabled(context)
    } else {
        areNotificationsEnabled(context)
    }
}

private fun areNotificationsEnabled(context: Context) =
    NotificationManagerCompat.from(context).areNotificationsEnabled()

@RequiresApi(api = Build.VERSION_CODES.O)
private fun isChannelDisabled(context: Context): Boolean{
    val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    val channel = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID)
    return channel.importance != NotificationManager.IMPORTANCE_NONE
}

private fun isOOrLater() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
2
thorin86

Cette méthode peut aider:

public boolean isNotificationChannelDisabled(@NonNull String channelId) {
        if(!channelId.equals(EMPTY)) {
            NotificationChannel channel = getManager().getNotificationChannel(channelId);
            return channel.getImportance() == NotificationManager.IMPORTANCE_NONE;
        }

        return false;
    }

private NotificationManager getManager(@NonNull Context context) {
        return mManager(Android.app.NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    }
2
shailesh mota
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            if(NotificationManagerCompat.from(context).areNotificationsEnabled()) {
                for (String channelId : channelIds) {
                    if (!TextUtils.isEmpty(channelId)) {
                        NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                        if (manager != null) {
                            NotificationChannel channel = manager.getNotificationChannel(channelId);
                            if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE)
                                return false;
                        }
                    }
                }
                return true;
            }else return false;
        }else{
            return NotificationManagerCompat.from(context).areNotificationsEnabled();
        }
0
Max Droid