2014-10-21 8 views
7

Ich habe ein Problem, dass ich die Antwort nicht finden kann. Ich habe die AndroidDeveloper Tutorials ausprobiert, ich habe hier auf stackoverflow und google gesucht aber entweder sind meine Such-Fähigkeiten awefull oder es gibt keine Antwort die ich meiner Meinung nach mein Problem antworte.Stack-Benachrichtigungen in Kitkat (API 19) mit setGroup() funktioniert nicht

Ich möchte Nachrichtenbenachrichtigungen in einer Benachrichtigung für alle neuen Nachrichten stapeln, wenn es mehrere gibt. Ich kann für jede Nachricht eine Benachrichtigung anzeigen, aber ich kann keine Stapel-/Zusammenfassungsbenachrichtigung erstellen.

Das Beste, was ich bekommen, ist dies: http://developer.android.com/images/android-5.0/notifications/Summarise_Dont.png

Was ich will, ist dies: http://developer.android.com/images/android-5.0/notifications/Summarise_Do.png

Ich bin mit API 19 und es muss nicht zurück-kompatibel sein. Schreibe meinen Code in AndroidStudio und teste in Genymotion.

ich versucht habe, mit NotificationCompatManager mit dem Ergebnis der Mehrfachanmeldungen mit: NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

Ich habe auch versucht NotificationManager mit dem gleichen Ergebnis verwendet, das heißt mehrere Benachrichtigungen:

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

Meine Benachrichtigung Aussehen wie folgt:

Notification notification = new NotificationCompat.Builder(this) .setContentTitle("New message from... ") .setContentText("Message:...") .setSmallIcon(R.drawable.icon) .setContentIntent(pIntent) .setSound(RingtoneManager.getDefaultUri(TYPE_NOTIFICATION)) .setGroup(mNoti) .setGroupSummary(true) .setAutoCancel(true) .build();

Und ich Feuer der Meldung wie folgt aus:

notificationManager.notify(counter, notification); 

Wo Zählerinkrementierungen für jede Meldung so dass jede Meldung eine eigene ID hat.

Ich habe dieses Formular auch für den Aufbau und Fiering die Benachrichtigung ohne succsess versucht:

NotificationCompat.Builder notificationBuilder = 
      new NotificationCompat.Builder(this) 
        .setSmallIcon(R.drawable.icon) 
        .setContentTitle("message from...") 
        .setContentText("message...") 
        .setContentIntent(pIntent) 
        .setAutoCancel(true) 
        .setGroup(mNoti) 
        .setGroupSummary(true) 
        .setSound(RingtoneManager.getDefaultUri(TYPE_NOTIFICATION)); 


    notificationManager.notify(counter, notificationBuilder.build()); 

setGroup offensichtlich für mich nicht die Feststellung. Ich verstehe nicht, warum es nicht funktioniert oder wie ich es zum Laufen bringen soll.

meiner Gruppe sieht wie folgt aus:

final static String mNoti = "mNoti"; 

Das einzige, was aus der Ferne nahe kommt, was ich will für alle Mitteilungen die gleiche ID verwendet, damit die neuen Meldungen, die alten überschreibt und mit SetNumber (int) beim Erstellen der Benachrichtigung. Jedoch gibt dies nicht wirklich das Ergebnis, das ich will, weil ich nicht glaube, dass ich die Anzahl der Benachrichtigungen erhalten kann, die nicht vom Benutzer gehandhabt werden. Oder kann ich?

Kann mir jemand helfen, mein gewünschtes Ziel zu erreichen?

Antwort

1

Der Grund, warum Sie Ergebnisse wie in http://developer.android.com/images/android-5.0/notifications/Summarise_Dont.png erhalten, liegt daran, dass Sie die Gruppenzusammenfassung für alle Benachrichtigungen auf true setzen. In den API-Dokumenten wird beschrieben: Set this notification to be the group summary for a group of notifications. Dies bedeutet, dass jede Benachrichtigung als Zusammenfassung behandelt wird und somit als neue Benachrichtigung angezeigt wird.

Um Ihr Problem zu lösen, können Sie jedes Mal, wenn Sie eine neue Benachrichtigung erhalten, eine neue Zusammenfassung senden. Beachten Sie, dass ich nicht 100% sicher bin, dass dies die beste Lösung ist, aber es löst das Problem. Ich habe eine Testanwendung, die Benachrichtigungen fügt basierend auf Tastenklicks:

public class MyActivity extends Activity { 

    private final static String GROUP_KEY_MESSAGES = "group_key_messages"; 
    public static int notificationId = 0; 
    private NotificationManagerCompat manager; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 

     manager = NotificationManagerCompat.from(this); 
     manager.cancelAll(); 
    } 

    public void addNotification(View v) { 
     notificationId++; // Increment ID 

     Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 

     Intent viewIntent = new Intent(this, ShowNotificationActivity.class); 
     viewIntent.putExtra("notificationId", notificationId); // Put the notificationId as a variable for debugging purposes 

     PendingIntent viewPendingIntent = PendingIntent.getActivity(this, notificationId, viewIntent, 0); // Intent to next activity 

     // Group notification that will be visible on the phone 
     Notification summary = new NotificationCompat.Builder(this) 
       .setAutoCancel(true) 
       .setContentIntent(viewPendingIntent) 
       .setContentTitle("New notifications") 
       .setContentText("You have "+notificationId+" new messages") 
       .setLargeIcon(icon) 
       .setGroup(GROUP_KEY_MESSAGES) 
       .setGroupSummary(true) 
       .build(); 

     manager.cancelAll(); // Is this really needed? 
     manager.notify(notificationId, summary); // Show this summary 
    } 
} 

ShowNotificationActivity:

public class ShowNotificationActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_show_notification); 

     Intent intent = getIntent(); 
     int counter = intent.getIntExtra("COUNTER", -57); 
     Log.d("COUNTER", ""+counter); 

     TextView view = (TextView)(findViewById(R.id.textView)); 
     view.setText("You have just read "+counter+" messages"); 
     MyActivity.notificationId = 0; // Reset ID. Should not be done like this, but used to show functionality. 
    } 
} 

Die erste Aktivität MyActivity verwendet wird, Benachrichtigungen zu handhaben. Ich schätze, dass dies meistens in Empfängern gemacht wird. Eine Schaltfläche in MyActivity löst addNotification aus, die die neue Benachrichtigungszusammenfassung verschiebt. Vor dem Hinzufügen der Zusammenfassung werden alle alten Zusammenfassungen abgebrochen. Wenn Sie auf die Zusammenfassung klicken, gelangen Sie zur Startaktivität ShowNotificationActivty, in der Daten angezeigt werden. Wenn dies beispielsweise eine E-Mail-App wäre, wäre MyActivity eine Art E-Mail-Empfänger, der die E-Mail in einer Datenbank speichert. Die notificationId könnte auf eine ID gesetzt werden, die in der Datenbank gespeichert ist. Wenn auf die Benachrichtigungen geklickt wird, kann die E-Mail basierend auf notificationId angezeigt werden.

Ich hoffe, das hilft :)

+1

folgte ich Ihren Rat und verwendet setGroupSummary und setGroup und es hat funktioniert, wenn auch nur auf Android 5.0 und höher. 4.4 und 4.2 zeigen jede Benachrichtigung separat. Dies geht über die ursprüngliche Frage hier hinaus, also habe ich eine neue erstellt: http://stackoverflow.com/q/31483772/1204377 –

+0

@AntonCherkashyn Sind Sie sicher, dass Sie diese Zeile enthalten haben: 'manager.cancelAll(); // Ist das wirklich nötig? '? Dies ist der "Trick", um die alten Benachrichtigungen zu schließen, die nur die Zusammenfassung offen lassen. – Pphoenix

+0

Ich habe das versucht und dann sehe ich nur die Zusammenfassung Benachrichtigung auf dem Telefon, stimmt, aber mein Endziel ist es, Benachrichtigung auf Android Wear gestapelt haben, und dazu muss ich N individuelle Benachrichtigungen + 1 Zusammenfassung Benachrichtigung per Android-Entwickler Giodelines feuern : https://developer.android.com/training/ wearables/notifications/stacks.html. Aufruf von manager.cancelAll(); Löst auch Benachrichtigungen über Android ab. Also das wird nicht funktionieren, da diese einzelnen Benachrichtigungen benutzerdefinierte Aktionen/Seiten/etc. haben. –