Як додати кнопку до сповіщень в android?


84

Мій додаток відтворює музику, і коли користувачі відкривають екран сповіщень, проводячи пальцем від верхньої частини екрана (або, як правило, від нижнього правого кута екрана на планшетах), я хочу подарувати їм кнопку, щоб зупинити відтворювану музику та запустити її знову, якщо вони хочуть.

Я не планую розміщувати віджет на головному екрані користувача, а просто надсилати сповіщення. Як я можу це зробити?


вибач у такому випадку
франк

62
Я думаю, це правильне запитання
hunterp

7
Як це не слушне запитання ffs?
Раду,

3
Деякі люди просто голосують проти повних запитань, але чому

7
Це найкращий результат у моєму пошуку в Google і без відповідей ...
Бен,

Відповіді:


11

Ви можете створити задум для дії (у цьому випадку припиніть відтворення) і додати його як кнопку дії до свого сповіщення.

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

Зверніться до документації Android .


Щоб покращити свою відповідь, ви додасте "текст" без піктограми. Будь ласка, надайте спосіб створити намір, додайте кнопку значка в область сповіщень і приєднайте обидва, а потім, як отримати намір.
tabebqena

8

Додати кнопку дії до сповіщення

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

Щоб отримати докладнішу інформацію, відвідайте https://developer.android.com/training/notify-user/build-notification.html


Щоб покращити свою відповідь, ви додасте "текст" без піктограми. Будь ласка, надайте спосіб створити намір, додайте піктограму в область сповіщень і приєднайте обидва.
tabebqena

"Кнопка" Додати дію "додасть кнопку під вмістом сповіщення, не входить до нього.
tabebqena

4

Я спробую надати рішення, яке я використовував, і більшість музичного програвача також використовують ту саму техніку, щоб показати елементи керування програвачем на панелі сповіщень.

Я використовую службу, яка використовується для управління медіапрогравачем та всіма його елементами управління. Діяльність Користувацький контроль взаємодіє зі Службою, наприклад, надсилаючи Інтенції службі

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

        startService(i);

Щоб отримувати наміри та виконувати дії в класі Service, я використовую наступний код у методі onStartCommand Service

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


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

Тепер, щоб точно відповісти на ваше запитання, щоб показати сповіщення з елементами управління відтворенням. Ви можете викликати наступні методи, щоб показати сповіщення за допомогою елементів керування.

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

} Сподіваюся, це дійсно допоможе вам. І ви зможете досягти бажаного. Приємного кодування :)


1
Я не пробував. Але це, здається, єдина completeвідповідь, яка fitстосується випадку користувача.
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();

Будь ласка, зверніться до цього для отримання детальної інформації. Натисніть тут


1

Я думаю, що окрім Ankit Guptaвідповіді, ви можете використовувати MediaSession (API> 21), щоб додати власний вигляд mediaController :

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

Джерело: навчальний посібник

Ви можете створити власний вигляд і відобразити його в області повідомлень, перша відповідь тут чудова.


1

перевірений, робочий код з android Pie. Усі вони входять в один і той же клас обслуговування.

Показати сповіщення:

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

Допоміжна функція:

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

Для обробки дій:

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;

        }

    }
}

Вам також потрібно буде оновити свій маніфест:

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

1

Ви можете додати кнопку, як показано нижче, і можете виконати дію над цією кнопкою.

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 (робити свої речі)

  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

Не знаю, чи це правильно, чи ні, але це працює.

  1. Створіть BroadCastReceiverклас для отримання даних при натисканні кнопки.
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. Тепер у будь-якій діяльності, де ви хочете створити сповіщення -
 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. Тепер використовуйте цей очікуваний намір під час створення повідомлення і, нарешті, вам потрібно зареєструвати це мовлення, щоб отримати його в класі MyBroadCastReceiver.
BroadcastReceiver br = new MyBroadCastReceiver();
        IntentFilter filter = new IntentFilter("unique_id");
        registerReceiver(br, filter);

Тепер, якщо ви хочете зробити певні дії при натисканні кнопки, ви можете зробити це за допомогою onReceive()методу в MyBroadCastReceiverкласі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.