Làm cách nào để thêm nút vào thông báo trong Android?


84

Ứng dụng của tôi phát nhạc và khi người dùng mở màn hình thông báo bằng cách vuốt từ trên cùng của màn hình (hoặc thường là từ dưới cùng bên phải của màn hình trên máy tính bảng), tôi muốn hiển thị cho họ một nút để dừng nhạc hiện đang phát và bắt đầu lại nếu họ muốn.

Tôi không định đặt một widget trên màn hình chính của người dùng mà chỉ đưa vào các thông báo. Tôi có thể làm cái này như thế nào?


tôi xin lỗi trong trường hợp đó
Frankish

62
Tôi nghĩ rằng một câu hỏi hợp lệ của nó
hunterp

7
Làm thế nào đây không phải là một câu hỏi hợp lệ ffs?
Radu

3
Một số người chỉ downvote câu hỏi đầy ý nghĩa, nhưng tại sao

7
Đây là kết quả hàng đầu trong tìm kiếm trên Google của tôi và không có câu trả lời ...
Ben

Câu trả lời:


11

Bạn có thể tạo ý định cho hành động (trong trường hợp này là ngừng phát) và thêm ý định đó làm nút hành động vào thông báo của bạn.

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

Vui lòng tham khảo tài liệu Android .


Để cải thiện câu trả lời của mình, bạn sẽ thêm "văn bản" không có biểu tượng. Cung cấp cách tạo ý định, thêm nút biểu tượng vào vùng thông báo và kết hợp cả hai, sau đó là cách nhận ý định.
tabebqena 25/07/19

8

Thêm nút hành động vào thông báo

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

Để biết thêm chi tiết, hãy truy cập https://developer.android.com/training/notify-user/build-notification.html


Để cải thiện câu trả lời của bạn, bạn sẽ thêm "văn bản" không có biểu tượng. Mở rộng cung cấp cách tạo ý định, thêm nút biểu tượng vào khu vực thông báo và kết hợp cả hai.
tabebqena 25/07/19

"Thêm nút hành động" sẽ thêm nút bên dưới nội dung thông báo không có trong đó.
tabebqena 25/07/19

4

Tôi sẽ cố gắng đưa ra giải pháp mà tôi đã sử dụng và hầu hết trình phát nhạc cũng sử dụng kỹ thuật tương tự để hiển thị các điều khiển trình phát trên thanh thông báo.

Tôi đang chạy một dịch vụ được sử dụng để quản lý Media Player và tất cả các điều khiển của nó. Ví dụ: Kiểm soát hoạt động của người dùng tương tác với Dịch vụ bằng cách gửi Ý định đến dịch vụ

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

        startService(i);

ĐỂ nhận ý định và thực hiện hành động trong lớp Dịch vụ Tôi đang sử dụng mã sau trong phương thức onStartCommand của Dịch vụ

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


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

Bây giờ để trả lời chính xác câu hỏi của bạn để hiển thị thông báo với các điều khiển đang phát. Bạn có thể gọi các phương pháp sau để hiển thị thông báo với các điều khiển.

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

} Hy vọng điều này thực sự hữu ích cho bạn. Và bạn sẽ có thể đạt được những gì bạn muốn. Chúc bạn có một mã hóa vui vẻ :)


1
Tôi đã không thử nó. Nhưng có vẻ như completecâu trả lời duy nhất fitcho trường hợp người dùng.
tabebqena 25/07/19

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

Vui lòng tham khảo điều này để biết thêm chi tiết Bấm vào đây


1

Tôi nghĩ rằng bên cạnh Ankit Guptacâu trả lời, bạn có thể sử dụng MediaSession (API> 21) để thêm chế độ xem mediaController gốc :

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

Nguồn: hướng dẫn

bạn có thể tạo chế độ xem tùy chỉnh và hiển thị nó trong khu vực thông báo, câu trả lời đầu tiên ở đây là tuyệt vời.


1

đã thử nghiệm, mã làm việc với Android Pie. Tất cả đều nằm trong cùng một lớp dịch vụ.

Hiển thị thông báo:

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

Chức năng trợ giúp:

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

Để xử lý các hành động:

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;

        }

    }
}

Bạn cũng cần cập nhật tệp kê khai của mình:

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

1

bạn có thể thêm nút như bên dưới và có thể thực hiện hành động trên nút đó cũng như tôi đã thực hiện cho tôi như bên dưới vui lòng kiểm tra.

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 (làm công việc của bạn)

  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

Tôi không biết liệu đây có phải là cách đúng hay không, nhưng nó có hiệu quả.

  1. Tạo một BroadCastReceiverlớp để nhận dữ liệu khi nhấn nút.
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. Bây giờ trong bất kỳ hoạt động nào bạn muốn tạo thông báo -
 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. Bây giờ hãy sử dụng ý định đang chờ xử lý này khi bạn đang tạo thông báo và cuối cùng bạn cần đăng ký chương trình phát sóng này để nhận nó trong lớp MyBroadCastReceiver.
BroadcastReceiver br = new MyBroadCastReceiver();
        IntentFilter filter = new IntentFilter("unique_id");
        registerReceiver(br, filter);

Bây giờ nếu bạn muốn thực hiện một số việc nhất định khi nút được nhấn, bạn có thể làm như vậy trong onReceive()phương thức trong MyBroadCastReceiverlớp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.