web-dev-qa-db-fra.com

Android O - Notification de ligne unique - comme le "Système Android - Chargement de cet appareil par USB"

J'aimerais avoir une notification continue pour ma ForegroundService qui nécessite le moins de place possible. J'aime le style "Système Android - Chargement de cet appareil par USB", mais je ne trouve aucun exemple pour y parvenir .  enter image description here

Est-ce que quelqu'un peut-il me montrer la bonne direction?

Mettre à jour

Le style est donné à la notification si l’importance IMPORTANCE_MIN est attribuée au canal.

Il semble qu’il n’y ait aucun moyen d’utiliser Androids dans le style intégré pour les notifications de IMPORTANCE_MIN à utiliser avec un ForegroundService.

Voici la description de IMPORTANCE_MIN:

Importance de la notification: affiche uniquement à l'ombre, en dessous du pli. Cela ne doit pas être utilisé avec Service.startForeground car un service de premier plan est censé intéresser l’utilisateur, il n’est donc pas logique de donner un sens sémantique à sa notification. Si vous faites cela à partir de la version Android Build.VERSION_CODES.O, le système affichera une notification de priorité supérieure concernant votre application en cours d'exécution en arrière-plan.

21
Sobvan

Pour répondre à la question initiale:

Il semble n'y avoir aucun moyen intégré sur Android O d'obtenir une seule ligne, notification en cours pour une ForegroundService. On pourrait essayer d’ajouter une conception personnalisée, mais comme différents téléphones ont différents modèles de notification, cette solution n’est guère bonne.

Il y a de l'espoir, cependant :)

SurAndroid Pla notification dans une NotificationChannel de IMPORTANCE_LOW avec une priorité de PRIORITY_LOW est compactée en une seule ligne, même pour une ForegroundService. Ouais!!

0
Sobvan

Pour afficher une notification compacte sur une seule ligne, telle que la notification de taxation, vous devez créer un Notification Channel avec une priorité sur IMPORTANCE_MIN. 

@TargetApi(Build.VERSION_CODES.O)
private static void createFgServiceChannel(Context context) {
   NotificationChannel channel = new NotificationChannel("channel_id", "Channel Name", NotificationManager.IMPORTANCE_MIN);
   NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
   mNotificationManager.createNotificationChannel(channel);
}

Et créez ensuite une notification en cours comme celle-ci:

public static Notification getServiceNotification(Context context) {
   NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, "channel_id");
   mBuilder.setContentTitle("One line text");
   mBuilder.setSmallIcon(R.drawable.ic_notification);
   mBuilder.setProgress(0, 0, true);
   mBuilder.setOngoing(true);
   return mBuilder.build();
}

REMARQUE 

Veuillez noter que je l'ai testé avec une IntentService au lieu de Service et cela fonctionne. De plus, je viens juste de vérifier le réglage d'une Thread.sleep() de 15 secondes et la notification s'affiche parfaitement jusqu'à ce que la variable IntentService s'arrête d'elle-même.

Il y a quelques images (désolé, certains textes sont en espagnol, mais je pense que les images sont toujours utiles):

 Single line ongoing notification

Et si vous faites glisser la souris et ouvrez la notification, elle s'affiche comme suit:

 Single line ongoing notification opened

SUPPLÉMENTAIRE

Si vous remarquez qu'Android System affiche une notification indiquant toutes les applications utilisant la batterie (applications avec services en cours), vous pouvez rétrograder la priorité de ce type de notifications. Ces notifications apparaissent sous la forme de notifications d'une ligne similaires à la notification de chargement.

Regarde ça:

 Battery applications

Cliquez simplement sur cette notification et sélectionnez TOUTES LES CATÉGORIES:

 Chennel notification for battery applications

Et définissez l'importance sur LOW:

 enter image description here

La prochaine fois, cette notification "consommation de la batterie" sera affichée comme notification de charge.

4
Marc Estrada

Vous devez définir la priorité de notification sur Min, l’importance de la chaîne de notification sur Min et désactiver l’affichage du badge de la chaîne de notification.

Voici un exemple de la façon dont je le fais. J'ai également inclus la création de la notification complète pour référence

private static final int MYAPP_NOTIFICATION_ID= -793531;

NotificationManager notificationManager = (NotificationManager) context
        .getSystemService(Context.NOTIFICATION_SERVICE);

String CHANNEL_ID = "myapp_ongoing";
CharSequence name = context.getString(R.string.channel_name_ongoing);

if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.O) {
    NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_MIN);
    channel.setShowBadge(false);

    notificationManager.createNotificationChannel(channel);
}

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
        context, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_stat_notification_add_reminder)
        .setContentTitle(context.getString(R.string.app_name))
        .setContentText(context.getString(R.string.create_new))
        .setOngoing(true).setWhen(0)
        .setChannelId(CHANNEL_ID)
        .setPriority(NotificationCompat.PRIORITY_MIN);

// Creates an intent for clicking on notification
Intent resultIntent = new Intent(context, MyActivity.class);
...

// The stack builder object will contain an artificial back stack
// for the
// started Activity.
// This ensures that navigating backward from the Activity leads out
// of
// your application to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(MyActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
        PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);

notificationManager.notify(MYAPP_NOTIFICATION_ID, mBuilder.build());
2
CodeChimp

Notification extensible

Par défaut, le contenu textuel de la notification est tronqué pour tenir sur une seule ligne. Si vous souhaitez que votre notification soit plus longue, vous pouvez activer une zone de texte plus grande et extensible en appliquant un modèle supplémentaire.

De plus, Android 4.1 prend en charge les notifications extensibles. En plus de la vue de notification normale, il est possible de définir une vue agrandie à afficher lorsque la notification est développée. Il existe trois styles à utiliser avec la vue agrandie: le style grande image, le style grand texte et le style Boîte de réception. Le code suivant illustre l'utilisation de BigTextStyle () qui permet d'utiliser jusqu'à 256 dp.

Par exemple :

String longText = "...";

Notification noti = new Notification.Builder(this)
.....
.....
.....
.setStyle(new Notification.BigTextStyle().bigText(longText))
0
Viral Patel