Wie füge ich eine Schaltfläche zu Benachrichtigungen in Android hinzu?

82

Meine App spielt Musik ab. Wenn Benutzer den Benachrichtigungsbildschirm öffnen, indem sie vom oberen Bildschirmrand (oder im Allgemeinen vom unteren rechten Bildschirmrand auf Tablets) wischen, möchte ich ihnen eine Schaltfläche zum Stoppen der aktuell wiedergegebenen Musik und zum erneuten Starten anzeigen Sie wollen.

Ich habe nicht vor, ein Widget auf dem Startbildschirm des Benutzers zu platzieren, sondern nur in Benachrichtigungen. Wie kann ich das machen?

fränkisch
quelle
Was ist das? Google ist mein Freund? soll ich * tfm? Vielen Dank für das Minus
Frankish
61
Ich denke, es ist eine gültige Frage
Hunterp
7
Wie ist das keine gültige Frage ffs?
Radu
3
Einige Leute stimmen nur bedeutungsvolle Fragen ab, aber warum
7
Dies ist das Top-Ergebnis in meiner Google-Suche und keine Antworten ...
Ben

Antworten:

9

Sie können eine Absicht für die Aktion erstellen (in diesem Fall beenden Sie die Wiedergabe) und diese als Aktionsschaltfläche zu Ihrer Benachrichtigung hinzufügen.

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

Weitere Informationen finden Sie in der Android-Dokumentation .

Ruben Miquelino
quelle
Um Ihre Antwort zu verbessern, fügen Sie "Text" ohne Symbol hinzu. Bitte geben Sie an, wie Sie die Absicht erstellen können, fügen Sie dem Benachrichtigungsbereich eine Symbolschaltfläche hinzu und verbinden Sie beide, um dann die Absicht zu erhalten.
Tabebqena
7

Aktionsschaltfläche zur Benachrichtigung hinzufügen

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

Weitere Informationen finden Sie unter https://developer.android.com/training/notify-user/build-notification.html

Labhya Sharma
quelle
Um Ihre Antwort zu verbessern, fügen Sie "Text" ohne Symbol hinzu. Bitte geben Sie an, wie Sie die Absicht erstellen möchten, fügen Sie im Benachrichtigungsbereich eine Symbolschaltfläche hinzu und verbinden Sie beide.
Tabebqena
"Aktionsschaltfläche hinzufügen" fügt die Schaltfläche unter dem nicht darin enthaltenen Benachrichtigungsinhalt hinzu.
Tabebqena
4

Ich werde versuchen, eine Lösung bereitzustellen, die ich verwendet habe, und die meisten Musik-Player verwenden dieselbe Technik, um die Player-Steuerelemente in der Benachrichtigungsleiste anzuzeigen.

Ich verwende einen Dienst, mit dem Media Player und alle seine Steuerelemente verwaltet werden. Aktivität Die Benutzersteuerung interagiert mit dem Dienst, indem sie beispielsweise Absichten an den Dienst sendet

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

        startService(i);

Um Absichten zu empfangen und Aktionen in der Serviceklasse auszuführen, verwende ich den folgenden Code in der onStartCommand-Servicemethode

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


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

Nun zur genauen Beantwortung Ihrer Frage, um eine Benachrichtigung mit den Spielsteuerelementen anzuzeigen. Sie können die folgenden Methoden aufrufen, um Benachrichtigungen mit Steuerelementen anzuzeigen.

   //    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);

} Hoffe das hilft dir wirklich. Und Sie werden in der Lage sein, das zu erreichen, was Sie wollen. Viel Spaß beim Codieren :)

Ankit Gupta
quelle
1
Ich habe es nicht versucht. Aber es scheint die einzige completeAntwort fitauf den Benutzerfall zu sein.
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();

Bitte beachten Sie dies für weitere Details. Klicken Sie hier

Chandsi Gupta
quelle
1

Ich denke, dass Sie neben der Ankit GuptaAntwort auch MediaSession (API> 21) verwenden können, um die native mediaController- Ansicht hinzuzufügen :

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

Quelle: Tutorial

Sie können auch eine benutzerdefinierte Ansicht erstellen und diese im Benachrichtigungsbereich anzeigen. Die erste Antwort hier ist großartig.

tabebqena
quelle
1

getestet, Arbeitscode mit Android Pie. Diese gehören alle zur selben Serviceklasse.

Benachrichtigung anzeigen:

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

Hilfsfunktion:

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

So handhaben Sie die Aktionen:

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;

        }

    }
}

Sie müssen auch Ihr Manifest aktualisieren:

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

Sie können die Schaltfläche wie unten hinzufügen und Aktionen auf dieser Schaltfläche ausführen, die ich auch für mich wie unten ausgeführt habe. Bitte überprüfen Sie dies.

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 (mach deine Sachen)

  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
                );
yuvrajsinh
quelle
0

Ich weiß nicht, ob das der richtige Weg ist oder nicht, aber es funktioniert.

  1. Erstellen Sie eine BroadCastReceiverKlasse, um die Daten zu empfangen, wenn die Taste gedrückt wird.
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. Jetzt in jeder Aktivität, in der Sie die Benachrichtigung erstellen möchten -
 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. Verwenden Sie jetzt diese ausstehende Absicht, wenn Sie die Benachrichtigung erstellen. Zuletzt müssen Sie diese Sendung registrieren, um sie in der MyBroadCastReceiver-Klasse zu empfangen.
BroadcastReceiver br = new MyBroadCastReceiver();
        IntentFilter filter = new IntentFilter("unique_id");
        registerReceiver(br, filter);

Wenn Sie nun bestimmte Dinge tun möchten, während die Taste gedrückt wird, können Sie dies in der onReceive()Methode in der MyBroadCastReceiverKlasse tun .

Sudhanshu Dubey
quelle