34 votes

Android O - Notification sur une seule ligne - comme le "Système Android - Chargement USB de cet appareil"

Je voudrais avoir une notification permanente pour ma ForegroundService qui nécessite que peu de place que possible. J'aime bien le "Système Android de recharge USB de cet appareil" style", mais je ne trouve aucun exemple comment atteindre cet objectif. enter image description here

Quelqu'un peut me pointer dans la bonne direction?

Mise à jour

Le style est donné à la notification, si le canal est assigné l'importance IMPORTANCE_MIN.

Il semble comme il n'existe aucun moyen d'utiliser les Androïdes construit dans le style pour les notifications de IMPORTANCE_MIN à être utilisé avec un ForegroundService.

Voici la description de l' IMPORTANCE_MIN:

Min de notification d'importance: seuls les montre dans l'ombre, au-dessous de la pliure. Ce ne doit pas être utilisé avec le Service.startForeground depuis le premier plan de service est censé être quelque chose que l'utilisateur se soucie de sorte qu'il ne fait pas de sens sémantique à l'occasion de sa notification d'un minimum d'importance. Si vous faites cela comme de la version Android de Construire.VERSION_CODES.O, le système affichera une priorité plus élevée de notification sur votre application en cours d'exécution en arrière-plan.

9voto

Marc Estrada Points 1334

Pour afficher un compact seule ligne de notification comme le chargement de notification, vous devez créer un Notification Channel avec priorité à 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 puis créer une notification permanente comme ça:

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();
}

NOTE

Veuillez noter que je l'ai testé avec un IntentService au lieu de Service, et il fonctionne. Aussi, j'ai juste vérifié la fixation d'un Thread.sleep() de 15 secondes et la notification montre parfaitement jusqu'à ce que l' IntentService s'arrête de lui-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 vers le bas et ouvre la notification, il est montré comme suit:

Single line ongoing notification opened

EXTRA

Si vous remarquez que le Système Android affiche une notification indiquant toutes les applications qui sont à l'aide de la batterie (pour les applications avec les services en cours), vous pouvez abaisser la priorité de ce type de notifications et il apparaîtra comme une ligne de notifications de la charge de la notification.

Jetez un oeil à ceci:

Battery applications

Juste le temps de cliquer sur cette notification, puis sélectionnez TOUTES les CATÉGORIES:

Chennel notification for battery applications

Et de définir l'importance de BASSE:

enter image description here

La prochaine fois, ce "la consommation de la batterie" notification sera montré que la charge de la notification.

3voto

CodeChimp Points 1087

Vous devez définir la priorité de notification sur Min, l'importance du canal de notification sur Min et désactiver l'affichage du badge du canal 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());
 

2voto

Szobi Points 98

Pour répondre à la question initiale:

Il semble y avoir aucun moyen intégré sur Android pour lire une seule ligne, en cours de notification pour un ForegroundService. On pourrait essayer d'ajouter une création sur mesure, mais aussi différents téléphones ont des conceptions différentes pour la notification, cette solution n'est guère une bonne.

Il y a de l'espoir :)

Sur Android P la notification en NotificationChannel de IMPORTANCE_LOW avec une priorité PRIORITY_LOW est compacté en une seule ligne, même pour un ForegroundService. Ouais!!

0voto

Jazib Khan Points 25

J'ai réduit la taille de la notification de service de premier plan en créant une vue personnalisée vide comme celle-ci:

 <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">


</LinearLayout>
 

puis en créant la notification comme ceci:

 RemoteViews notifiactionCollapsed = new RemoteViews(getPackageName(),R.layout.notification_collapsed);
    Notification notification = new NotificationCompat.Builder(this,CHANNEL_ID)
            .setSmallIcon(R.drawable.eq_icon)
            .setCustomContentView(notifiactionCollapsed)
            .setStyle(new NotificationCompat.DecoratedCustomViewStyle())
            .setShowWhen(false)
            .setContentIntent(pendingIntent)
            .setPriority(NotificationCompat.PRIORITY_LOW)
            .setOngoing(true)
            .setVisibility(NotificationCompat.VISIBILITY_SECRET)
            .build();
    startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,
            notification);
 

Cela aide à réduire la hauteur de la notification, mais je ne sais toujours pas comment masquer l'icône de notification.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X