it-swarm.com.de

Wie füge ich Benachrichtigungen in Android hinzu?

Meine App spielt Musik. Wenn Benutzer den Benachrichtigungsbildschirm durch Wischen vom oberen Bildschirmrand (oder generell von der unteren rechten Bildschirmseite auf Tablets) öffnen, möchte ich ihnen eine Schaltfläche anzeigen, mit der die aktuell abgespielte Musik angehalten und erneut gestartet werden kann Sie wollen.

Ich plane nicht, ein Widget auf dem Homescreen des Benutzers zu platzieren, sondern lediglich Benachrichtigungen. Wie kann ich das machen?

68
frankish

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

5
labhya sharma
    // 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

3
Chandsi Gupta

Sie können eine Absicht für die Aktion erstellen (in diesem Fall aufhören zu spielen) und diese als Benachrichtigungsschaltfläche 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);

Bitte beziehen Sie sich auf die Android-Dokumentation hier

3
Ruben Miquelino

getestet, funktionierender Code 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>
1
Al Ro

Ich denke, dass Sie neben Ankit Gupta answer MediaSession (API> 21) verwenden können, um 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 lautet hier ist großartig.

1
tabebqena

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

Ich führe einen Dienst aus, der zum Verwalten von Media Player und sämtlichen Steuerelementen verwendet wird. Aktivität Die Benutzersteuerung interagiert mit dem Dienst, indem sie z. B. Absichten an den Dienst sendet

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

        startService(i);

Um Absichten zu erhalten und Aktionen in der Serviceklasse auszuführen Ich verwende den folgenden Code in der onStartCommand-Methode von Service

 @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 Antwort auf Ihre 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 können erreichen, was Sie wollen. Haben Sie eine glückliche Codierung :) 

0
Ankit Gupta