2016-05-02 24 views
7

Sto cercando di far funzionare le notifiche locali come Hangouts. Vorrei ricevere una notifica all'avviso ogni volta che viene ricevuto un nuovo messaggio di testo. Ma quando ci sono due o più notifiche non lette vorrei mostrare una notifica di riepilogo nella barra delle notifiche di Android. Sembra impilare la notifica tramite gruppi e aggiungere un riepilogo di gruppo dovrebbe funzionare come descritto here. Il codice qui sotto sembra funzionare per me su Android 5.0 e 5.1, ma su Android 6.0 la notifica locale non attiva l'allarme/viene visualizzata nella visuale a testa alta quando esiste una notifica di riepilogo per quel gruppo. Quindi viene visualizzata solo la notifica iniziale.Notifica di gruppo Android non attiva dopo l'aggiunta della notifica di riepilogo (Android 6.0)

public class MainActivity extends AppCompatActivity { 

private Button _button = null; 
final static String GROUP_KEY_EMAILS = "group_key_emails"; 
private int messageNum = 1; 

private void CreateNotification() { 
    // Build the notification, setting the group appropriately 
    Notification headsUpNotification = new NotificationCompat.Builder(this) 
      .setContentTitle("Title") 
      .setContentText("New Message" + messageNum) 
      .setSmallIcon(R.drawable.pngreceivedtextmessage) 
      .setGroup(GROUP_KEY_EMAILS) 
      .setPriority(Notification.PRIORITY_HIGH) 
      .setDefaults(Notification.DEFAULT_ALL) 
      .build(); 

    // Issue the notification 
    NotificationManagerCompat notificationManager = 
      NotificationManagerCompat.from(this); 
    notificationManager.notify(messageNum, headsUpNotification); 

    Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), 
      R.drawable.pngreceivedmessageicon); 

    if(messageNum > 1) { 
     // Create a summary notification since we have more than 1 
     Notification summaryNotification = new NotificationCompat.Builder(this) 
       .setContentTitle("Summary") 
       .setNumber(messageNum) 
       .setSmallIcon(R.drawable.pngreceivedtextmessage) 
       .setLargeIcon(largeIcon) 
       .setGroup(GROUP_KEY_EMAILS) 
       .setGroupSummary(true) 
       .build(); 

     notificationManager.notify(0, summaryNotification); 
    } 

    messageNum++; 
} 

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

    _button = (Button) findViewById(R.id.button); 
    _button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      CreateNotification(); 
     } 
    }); 
} 

sto il targeting SDK 23 e provato molti combinazione diversa, ma non funziona niente. Qualcuno sa come generare una notifica di riepilogo e continuare a ricevere notifiche di avviso?

+0

Hai chiesto permessi di runtime per Android M? –

+0

Non pensavo che stavo facendo qualcosa che richiedeva un permesso. Quale permesso avrei bisogno? – Alex

risposta

3

In Android 6.0, vi è una leggera modifica nel modo in cui vengono visualizzate le notifiche/notifiche di riepilogo. Se continui a inviare ripetutamente un sacco di notifiche, il sistema di notifica non mostra una visualizzazione heads-up se c'è una durata molto breve tra le notifiche consecutive.

Al fine di confermare questo, in primo luogo aggiungere questo codice nel secondo costruttore di notifica all'interno che if (questo mancava nel codice al fine di mostrare come la massima priorità e con allarme):

.setPriority(Notification.PRIORITY_HIGH) 
.setDefaults(Notification.DEFAULT_ALL) 

e quindi testare la notifica di emissione dopo ogni paio di secondi (lasciare che la precedente notifica heads-up vada via, quindi attendere alcuni secondi). Se lo fai correttamente dovresti vedere il display heads-up con allarme per ogni notifica.

Se si avvia l'invio di notifiche ripetutamente e molto veloce, l'heads-up non verrà visualizzato. Basta aspettare 1-2 minuti e poi emetterlo di nuovo, quindi si presenterà in heads-up.

+0

Grazie, ho cambiato il codice per creare un nuovo testo di notifica ogni volta, ma la notifica di testata continua a funzionare. Se aggiungo la priorità e le impostazioni predefinite alla notifica di riepilogo, la notifica di riepilogo viene visualizzata come notifica di verifica. Questo non è quello che voglio, voglio solo aggiornare il sommario ma visualizzare la normale notifica "Nuovo messaggio" a testa alta. – Alex

+0

crea il sommario per primo – conca

1

La mia supposizione è che dal momento che si sta riutilizzando l'hardcoded 0 come notificationId quando si richiama notificationManager.notify(0, summaryNotification); - il sistema poteva ignorare ulteriori aggiornamenti

Prova ad aggiungere un ID incrementale invece:

Nella classe MainActivity

  1. aggiungere un campo private static int lastNotificationId = 0;
  2. utilizzare l'ID dinamico in notificationManager.notify(MainActivity.lastNotificationId++, summaryNotification);

Non ho provato da solo sul tuo codice, ma ricordo che ho avuto un problema simile in passato che è stato risolto in questo modo.

+0

Grazie, ma la creazione di un nuovo id ogni volta che la notifica di riepilogo non ha risolto il problema. Finisce per creare una nuova notifica separata nella barra delle notifiche che mi obbliga a cancellare manualmente quella precedente.Inoltre, sto generando un nuovo ID di notifica per la notifica heads up già. – Alex

+0

Quindi è possibile evitare la cancellazione manuale da parte dell'utente e annullarla effettivamente dal codice, con 'notificationManager.cancel (lastNotificationId)' prima di pubblicare l'ultima. È posizionato nella giusta posizione che vorresti che fosse nella barra delle notifiche? Ora fa scattare correttamente l'heads-up? (eccetto che il vecchio è ancora lì.) –

+0

No, la notifica di heads-up non è ancora stata attivata correttamente. – Alex