Android में सूचनाओं के लिए बटन कैसे जोड़ें?


84

मेरा ऐप संगीत बजाता है और जब उपयोगकर्ता स्क्रीन के ऊपर से स्वाइप करके (या आमतौर पर टैबलेट पर स्क्रीन के नीचे दाईं ओर से) नोटिफिकेशन स्क्रीन खोलते हैं, तो मैं उन्हें वर्तमान में चल रहे संगीत को रोकने के लिए एक बटन पेश करना चाहता हूं और इसे फिर से शुरू करूंगा वो चाहते हैं।

मैं उपयोगकर्ता के होम स्क्रीन पर एक विजेट लगाने की योजना नहीं बना रहा हूं, लेकिन सिर्फ सूचनाओं में। मैं यह कैसे कर सकता हूँ?


मुझे इस मामले में खेद है
फ्रैंक

62
मुझे लगता है कि इसका एक वैध प्रश्न है
शिकारी जूल

7
यह एक वैध प्रश्न कैसे नहीं है?
रादु

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 दस्तावेज़ देखें ।


अपने उत्तर को बेहतर बनाने के लिए, आप बिना आइकन के "टेक्स्ट" जोड़ेंगे। आशय बनाने के लिए Ppease orovide तरीका, अधिसूचना क्षेत्र में आइकन बटन जोड़ें और दोनों को मिलाएं, फिर आशय कैसे प्राप्त करें।
ताबिकेना

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 पर जाएं


अपने उत्तर को बेहतर बनाने के लिए, आप बिना आइकन के "टेक्स्ट" जोड़ेंगे। आशय बनाने के लिए Ppease orovide तरीका, अधिसूचना क्षेत्र जोड़ें आइकन बटन और दोनों को मिलाएं।
ताबिकेना

"एक्शन बटन जोड़ें" अधिसूचना सामग्री के नीचे का बटन जोड़ देगा न कि उसके भीतर।
टैबेबेना

4

मैं एक समाधान प्रदान करने की कोशिश करूंगा जिसका मैंने उपयोग किया है और अधिकांश संगीत खिलाड़ी अधिसूचना पट्टी में खिलाड़ी नियंत्रण दिखाने के लिए एक ही तकनीक का उपयोग करते हैं।

मैं एक सेवा चला रहा हूं, जिसका उपयोग मीडिया प्लेयर और उसके सभी नियंत्रणों को प्रबंधित करने के लिए किया जाता है। गतिविधि उपयोगकर्ता नियंत्रण उदाहरण के लिए सेवा में इरादे भेजकर सेवा के साथ सहभागिता करता है

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

        startService(i);

सेवा वर्ग में इरादों को प्राप्त करने और कार्रवाई करने के लिए मैं सेवा के onStartCommand विधि में निम्नलिखित कोड का उपयोग कर रहा हूं

 @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
ताबिकेना

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उत्तर के बगल में , आप मीडिया मीडिया (एपीआई> 21) का उपयोग कर सकते हैं देशी मीडियाकंट्रोलर दृश्य:

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 पाई के साथ परीक्षण किया गया, काम करने वाला कोड। ये सभी एक ही सेवा वर्ग के अंदर जाते हैं।

एक सूचना दिखाएं:

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.