Come aggiungere un pulsante alle notifiche in Android?


85

La mia app riproduce musica e quando gli utenti aprono la schermata delle notifiche scorrendo dall'alto dello schermo (o generalmente dall'angolo in basso a destra dello schermo sui tablet), desidero presentare loro un pulsante per interrompere la musica attualmente in riproduzione e riavviarla se loro vogliono.

Non ho intenzione di inserire un widget nella schermata iniziale dell'utente, ma solo nelle notifiche. Come posso fare questo?


mi dispiace in questo caso
franco

62
Penso che sia una domanda valida
hunterp

7
In che modo questa non è una domanda valida ffs?
Radu

3
Alcune persone si limitano a

7
Questo è il miglior risultato nella mia ricerca su Google e nessuna risposta ...
Ben

Risposte:


12

È possibile creare un intento per l'azione (in questo caso interrompere la riproduzione) e aggiungerlo come pulsante di azione alla notifica.

Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class);
snoozeIntent.setAction(ACTION_SNOOZE);
snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID, 0);
PendingIntent snoozePendingIntent =
        PendingIntent.getBroadcast(this, 0, snoozeIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setContentIntent(pendingIntent)
        .addAction(R.drawable.ic_snooze, getString(R.string.snooze),
                snoozePendingIntent);

Fare riferimento alla documentazione di Android .


Per migliorare la tua risposta, aggiungerai "testo" senza icona. Ppease orovide modo per creare l'intento, aggiungi il pulsante icona all'area di notifica e unisciti a entrambi, quindi come ricevere l'intento.
tabebqena

8

Aggiungi il pulsante di azione alla notifica

Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class);
snoozeIntent.setAction(ACTION_SNOOZE);
snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID, 0);
PendingIntent snoozePendingIntent =
        PendingIntent.getBroadcast(this, 0, snoozeIntent, 0);

NotificationCompat.Builder mBuilder = new 
NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setContentIntent(pendingIntent)
        .addAction(R.drawable.ic_snooze, getString(R.string.snooze),
                snoozePendingIntent);

Per maggiori dettagli, visita https://developer.android.com/training/notify-user/build-notification.html


Per migliorare la tua risposta, aggiungerai "testo" senza icona. Ppease orovide way to create the intent, add icon button to the notification area and join both.
tabebqena

"Aggiungi pulsante di azione" aggiungerà il pulsante sotto il contenuto della notifica non al suo interno.
tabebqena

4

Cercherò di fornire una soluzione che ho usato e la maggior parte del lettore musicale utilizza anche la stessa tecnica per mostrare i controlli del lettore nella barra di notifica.

Sto eseguendo un servizio che viene utilizzato per gestire Media Player e tutti i suoi controlli. Attività Il controllo utente interagisce con il servizio, ad esempio inviando Intent al servizio

 Intent i = new Intent(MainActivity.this, MyRadioService.class);
        i.setAction(Constants.Player.ACTION_PAUSE);

        startService(i);

Per ricevere gli intenti ed eseguire l'azione nella classe Service, sto usando il codice seguente nel metodo di servizio onStartCommand

 @Override
public int onStartCommand(Intent intent, int flags, int startId) {


    if (intent.getAction().equals(Constants.Player.ACTION_PAUSE)) {
        if(mediaPlayer.isPlaying()) {
            pauseAudio();
        }
    }

Ora per rispondere esattamente alla tua domanda per mostrare la notifica con i controlli di riproduzione. Puoi chiamare i seguenti metodi per mostrare la notifica con i controlli.

   //    showNotification
private void startAppInForeground() {
//  Start Service in Foreground

    // Using RemoteViews to bind custom layouts into Notification
    RemoteViews views = new RemoteViews(getPackageName(),
            R.layout.notification_status_bar);

// Define play control intent 
   Intent playIntent = new Intent(this, MyRadioService.class);
    playIntent.setAction(Constants.Player.ACTION_PLAY);

// Use the above play intent to set into PendingIntent
    PendingIntent pplayIntent = PendingIntent.getService(this, 0,
            playIntent, 0);

// binding play button from layout to pending play intent defined above 
views.setOnClickPendingIntent(R.id.status_bar_play, pplayIntent);
views.setImageViewResource(R.id.status_bar_play,
            R.drawable.status_bg);

Notification status = null;
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        status = new Notification.Builder(this).build();
    }

  status.flags = Notification.FLAG_ONGOING_EVENT;
    status.icon = R.mipmap.ic_launcher;
    status.contentIntent = pendingIntent;
    startForeground(Constants.FOREGROUND_SERVICE, status);

} Spero che questo ti aiuti davvero. E sarai in grado di ottenere ciò che desideri. Buona programmazione :)


1
Non l'ho provato. Ma sembra l'unica completerisposta che fital caso dell'utente.
tabebqena

4
    // It shows buttons on lock screen (notification).

Notification notification = new Notification.Builder(context)
    .setVisibility(Notification.VISIBILITY_PUBLIC)
    .setSmallIcon(R.drawable.NotIcon)
    .addAction(R.drawable.ic_prev, "button1",ButtonOneScreen) 
    .addAction(R.drawable.ic_pause, "button2", ButtonTwoScreen)  
   .....
    .setStyle(new Notification.MediaStyle()
    .setShowActionsInCompactView(1)
    .setMediaSession(mMediaSession.getSessionToken())
    .setContentTitle("your choice")
    .setContentText("Again your choice")
    .setLargeIcon(buttonIcon)
    .build();

Fare riferimento a questo per maggiori dettagli. Fare clic qui


1

Penso che oltre alla Ankit Guptarisposta, puoi usare MediaSession (API> 21) per aggiungere la visualizzazione mediaController nativa :

notificationBuilder
        .setStyle(new Notification.MediaStyle()
            .setShowActionsInCompactView(new int[]{playPauseButtonPosition})  // show only play/pause in compact view
            .setMediaSession(mSessionToken))
        .setColor(mNotificationColor)
        .setSmallIcon(R.drawable.ic_notification)
        .setVisibility(Notification.VISIBILITY_PUBLIC)
        .setUsesChronometer(true)
        .setContentIntent(createContentIntent(description)) // Create an intent that would open the UI when user clicks the notification
        .setContentTitle(description.getTitle())
        .setContentText(description.getSubtitle())
        .setLargeIcon(art);

Fonte: tutorial

puoi anche creare una visualizzazione personalizzata e visualizzarla nell'area di notifica, la prima risposta qui è ottima.


1

codice funzionante testato con Android Pie. Questi rientrano tutti nella stessa classe di servizio.

Mostra una notifica:

public void setNotification() {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
    {
    NotificationChannel channel = new NotificationChannel("a", "status", NotificationManager.IMPORTANCE_DEFAULT);
    channel.setDescription("notifications");
    notificationManager = getSystemService(NotificationManager.class);
    notificationManager.createNotificationChannel(channel);

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


Receiver.service = this;
Notification.MediaStyle style = new Notification.MediaStyle();

notification = new Notification.Builder(this)
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentTitle("Notification")
        .addAction(R.drawable.close_icon,  "quit_action", makePendingIntent("quit_action"))
        .setStyle(style);

style.setShowActionsInCompactView(0);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
    {
    notification.setChannelId("a");
    }

// notificationManager.notify(123 , notification.build()); // pre-oreo
startForeground(126, notification.getNotification());
}

Funzione di aiuto:

public PendingIntent makePendingIntent(String name)
    {
    Intent intent = new Intent(this, FloatingViewService.Receiver.class);
    intent.setAction(name);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    return pendingIntent;
    }

Per gestire le azioni:

static public class Receiver extends BroadcastReceiver {
static FloatingViewService service;

@Override
public void onReceive(Context context, Intent intent)
    {

    String whichAction = intent.getAction();

    switch (whichAction)
        {

        case "quit_action":
            service.stopForeground(true);
            service.stopSelf();
            return;

        }

    }
}

Dovrai aggiornare anche il tuo manifest:

<receiver android:name=".FloatingViewService$Receiver">
        <intent-filter>
            <action android:name="quit_action" />
        </intent-filter>
    </receiver>

1

puoi aggiungere il pulsante come sotto e puoi eseguire un'azione su quel pulsante anche io ho fatto per me come sotto, per favore controlla.

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                        .setSmallIcon(R.drawable.ic_logo)
                        .setAutoCancel(true)
                        .setContentTitle(name)
                        .setContentText(body)
                        .setGroupSummary(true)
                        .addAction(android.R.drawable.ic_menu_directions, "Mark as read", morePendingIntent);

// morePendingIntent (fai le tue cose)

  PendingIntent morePendingIntent = PendingIntent.getBroadcast(
                        this,
                        REQUEST_CODE_MORE,
                        new Intent(this, NotificationReceiver.class)
                                .putExtra(KEY_INTENT_MORE, REQUEST_CODE_MORE)
                                .putExtra("bundle", object.toString()),
                        PendingIntent.FLAG_UPDATE_CURRENT
                );

0

Non so se sia la strada giusta oppure no, ma funziona.

  1. Crea una BroadCastReceiverclasse per ricevere i dati quando viene premuto il pulsante.
public class MyBroadCastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        
        String log = "URI: " + intent.toUri(Intent.URI_INTENT_SCHEME);
        Log.d("my", "LOG:::::::" + log);
    }
}
  1. Ora in qualsiasi attività in cui desideri creare la notifica:
 Intent intent = new Intent();
        intent.setAction("unique_id");
        intent.putExtra("key", "any data you want to send when button is pressed");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, REQUEST_CODE, intent, 0);
  1. Ora usa questo intento in sospeso quando crei la notifica e infine devi registrare questa trasmissione per riceverla nella classe MyBroadCastReceiver.
BroadcastReceiver br = new MyBroadCastReceiver();
        IntentFilter filter = new IntentFilter("unique_id");
        registerReceiver(br, filter);

Ora, se vuoi fare certe cose quando il pulsante viene premuto, puoi farlo nel onReceive()metodo in MyBroadCastReceiverclasse.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.