NotificationCompat.Builder को Android O में दर्शाया गया है


161

मेरे प्रोजेक्ट को Android O में अपग्रेड करने के बाद

buildToolsVersion "26.0.1"

एंड्रॉइड स्टूडियो में लिंट अनुसरण अधिसूचना बिल्डर विधि के लिए एक पदावनत चेतावनी दिखा रहा है:

new NotificationCompat.Builder(context)

समस्या यह है: Android डेवलपर्स Android O में सूचनाओं का समर्थन करने के लिए NotificationChannel का वर्णन करते हुए अपने दस्तावेज़ीकरण को अपडेट करते हैं, और हमें एक स्निपेट प्रदान करते हैं, फिर भी समान पदच्युत चेतावनी के साथ:

Notification notification = new Notification.Builder(MainActivity.this)
        .setContentTitle("New Message")
        .setContentText("You've received new messages.")
        .setSmallIcon(R.drawable.ic_notify_status)
        .setChannelId(CHANNEL_ID)
        .build();  

सूचनाएं अवलोकन

मेरा प्रश्न: क्या अधिसूचना बनाने के लिए कोई और उपाय है, और फिर भी Android O का समर्थन करते हैं?

एक समाधान जो मैंने पाया है वह चैनल आईडी को अधिसूचना में एक पैरामीटर के रूप में पारित करना है। निर्माण निर्माता। लेकिन यह समाधान वास्तव में पुन: प्रयोज्य नहीं है।

new Notification.Builder(MainActivity.this, "channel_id")

4
लेकिन यह समाधान वास्तव में पुन: प्रयोज्य नहीं है। ऐसा कैसे?
टिम

5
NotificationCompat.Builder को सूचित किया जाता है Notification.Builder। सूचना का हिस्सा चला गया। अधिसूचना उनका नया वर्ग है जहां वे सब कुछ सुव्यवस्थित कर रहे हैं
कपिल जी

1
@kapsym वास्तव में यह दूसरा तरीका है। अधिसूचना
टिम

इसके अलावा, मुझे यह नहीं दिखाई देता है कि यहाँ डेवलपर .android.com/reference/android/support/v4/app/… । शायद लिंट में एक बग
कपिल जी

चैनल आईडी को कंस्ट्रक्टर पर पारित किया जाता है, या उपयोग करके रखा जा सकता है notificationBuild.setChannelId("channel_id")। मेरे मामले में यह अंतिम समाधान अधिक पुन: NotificationCompat.Builderउपयोग किया जाता है क्योंकि मेरे एक जोड़े के तरीकों में पुन: उपयोग किया जाता है, जिससे आइकन, ध्वनियों और कंपन के मापदंडों को बचाया जा सकता है।
गुइलहर्मफेगेल

जवाबों:


167

दस्तावेज में यह उल्लेख किया गया है कि बिल्डर विधि NotificationCompat.Builder(Context context)को हटा दिया गया है। और हमें उस निर्माता का उपयोग करना होगा जिसके पास channelIdपैरामीटर है:

NotificationCompat.Builder(Context context, String channelId)

अधिसूचना

यह कंस्ट्रक्टर एपीआई स्तर 26.0.0-beta1 में पदावनत किया गया था। इसके बजाय NotificationCompat.Builder (संदर्भ, स्ट्रिंग) का उपयोग करें। सभी पोस्ट किए गए नोटिफिकेशन में NotificationChannel Id निर्दिष्ट करनी चाहिए।

अधिसूचना

इस कंस्ट्रक्टर को एपीआई स्तर 26 में अपदस्थ किया गया था। इसके बजाय नोटिफिकेशन।ब्यूटील (संदर्भ, स्ट्रिंग) का उपयोग करें। सभी पोस्ट किए गए नोटिफिकेशन में NotificationChannel Id निर्दिष्ट करनी चाहिए।

यदि आप बिल्डर सेटर का पुन: उपयोग करना चाहते हैं, तो आप बिल्डर के साथ बना सकते हैं channelId, और उस बिल्डर को एक सहायक विधि से पास कर सकते हैं और उस पद्धति में अपनी पसंदीदा सेटिंग्स सेट कर सकते हैं।


3
ऐसा लगता है कि वे Notification.Builder(context)NotificationChannel सत्र में समाधान पोस्ट करते समय खुद का विरोध कर रहे हैं । लेकिन ठीक है, कम से कम आप इस पदावनति =) को सूचित करते हुए एक पद पा गए
गुइलहर्मफेगेल

23
ChannelId क्या है आप समझा सकते हैं?
संतनु सूर

15
ChannelId क्या है?
राउंडट्वो

3
आप अभी भी उपयोग कर सकते हैं NotificationCompat.Builder(Context context), और फिर चैनल को इस तरह असाइन कर सकते हैं :builder.setChannelId(String channelId)
deyanm

36
एक चैनल आईडी कोई भी स्ट्रिंग हो सकती है, टिप्पणियों में चर्चा करना बहुत बड़ा है, लेकिन इसका उपयोग आपकी सूचनाओं को श्रेणियों में अलग करने के लिए किया जाता है, ताकि उपयोगकर्ता अक्षम कर सके कि वह क्या सोचता है, जो आपके ऐप से सभी सूचनाओं को अवरुद्ध करने के बजाय उसके लिए महत्वपूर्ण नहीं है।
yehyatt

110

यहां छवि विवरण दर्ज करें

यहाँ पिछड़े संगतता के साथ एपीआई स्तर 26+ के रूप में सभी Android संस्करणों के लिए काम कर रहा है ।

 NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getContext(), "M_CH_ID");

        notificationBuilder.setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.ic_launcher)
                .setTicker("Hearty365")
                .setPriority(Notification.PRIORITY_MAX) // this is deprecated in API 26 but you can still use for below 26. check below update for 26 API
                .setContentTitle("Default notification")
                .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
                .setContentInfo("Info");

NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, notificationBuilder.build());

अधिकतम प्राथमिकता निर्धारित करने के लिए एपीआई 26 के लिए अद्यतन करें

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_MAX);

        // Configure the notification channel.
        notificationChannel.setDescription("Channel description");
        notificationChannel.enableLights(true);
        notificationChannel.setLightColor(Color.RED);
        notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
        notificationChannel.enableVibration(true);
        notificationManager.createNotificationChannel(notificationChannel);
    }


    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);

    notificationBuilder.setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_ALL)
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.drawable.ic_launcher)
            .setTicker("Hearty365")
       //     .setPriority(Notification.PRIORITY_MAX)
            .setContentTitle("Default notification")
            .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
            .setContentInfo("Info");

    notificationManager.notify(/*notification id*/1, notificationBuilder.build());

आप वास्तव में ऐप में स्क्रीन पर या किसी अन्य ऐप में अधिसूचना कैसे दिखा सकते हैं?
ब्लूबॉय

@BlueBoy मुझे आपका सवाल नहीं मिल रहा है। क्या आप बता सकते हैं कि आपको वास्तव में क्या चाहिए?
aks4125

@ Aks4125 अधिसूचना नीचे स्लाइड नहीं करता है और स्क्रीन के शीर्ष पर दिखाता है। आप एक टोन सुनते हैं, और एक छोटा नोटिफिकेशन आइकन स्टेटस बार में दिखाई देता है - लेकिन कुछ भी नहीं दिखता है और अगर आपको एक txt संदेश मिला है तो यह दिखाता है।
ब्लूबॉय

@BlueBoy आपको उस व्यवहार के लिए HIGH को प्राथमिकता देने की आवश्यकता है। यदि आपको इस कोड को अपडेट करने की आवश्यकता है तो मुझे बताएं। यदि आप उच्च प्राथमिकता अधिसूचना के लिए चारों ओर चुपके हैं, तो आपको अपना जवाब मिलेगा।
aks4125

2
@BlueBoy अद्यतन उत्तर की जाँच करें। यदि आप 26 एपीआई को लक्षित नहीं कर रहे हैं तो केवल .setPriority(Notification.PRIORITY_MAX)26 एपीआई के लिए अद्यतन कोड का उपयोग करने के साथ एक ही कोड का उपयोग करें `
Aks4125 8

31

2-arg कंस्ट्रक्टर को कॉल करें: Android O के साथ संगतता के लिए, support-v4 पर कॉल करें NotificationCompat.Builder(Context context, String channelId)। Android N या इससे पहले के संस्करण पर चलने पर, इस पर channelIdध्यान नहीं दिया जाएगा। जब Android O पर चल रहा हो, NotificationChannelतो उसी के साथ भी बनाएं channelId

आउट ऑफ़ डेट सैंपल कोड: कई JavaDoc पेज जैसे कि Notification.Bilder कॉलिंग पर सैंपल कोड new Notification.Builder(mContext)आउट ऑफ़ डेट है।

पदावनत किए गए निर्माणकर्ता: Notification.Builder(Context context) और v4 के NotificationCompat.Builder(Context context) पक्ष में पदावनत किए जाते हैं Notification[Compat].Builder(Context context, String channelId)। ( Notification.Builder (android.content.Context) और v4 NotificationCompat.Builder (संदर्भ संदर्भ) देखें ।)

पदावनत वर्ग: पूरी कक्षा v7 NotificationCompat.Builder पदावनत है। (देखें v7 NotificationCompat.Builder ।) इससे पहले, NotificationCompat.Builderसमर्थन करने के लिए v7 की आवश्यकता थी NotificationCompat.MediaStyle। एंड्रॉइड O NotificationCompat.MediaStyleमें, मीडिया-कॉम्पिटिटर लाइब्रेरी के android.support.v4.mediaपैकेज में एक v4 है । जरूरत पड़ने पर उस का उपयोग करें MediaStyle

एपीआई 14+: 26.0.0 और उच्चतर से समर्थन लाइब्रेरी में, समर्थन-वी 4 और समर्थन-वी 7 पैकेज दोनों 14. के न्यूनतम एपीआई स्तर का समर्थन करते हैं। वी # नाम ऐतिहासिक हैं।

हाल ही में समर्थन लाइब्रेरी संशोधन देखें ।


22

अधिक से Build.VERSION.SDK_INT >= Build.VERSION_CODES.Oअधिक उत्तरों के लिए जाँच करने के बजाय , थोड़ा सरल तरीका है -

AndroidManifest.xml फ़ाइल के applicationअनुभाग में निम्न पंक्ति जोड़ें, जैसा कि Android डॉक पर फायरबेस क्लाउड मैसेजिंग क्लाइंट ऐप के सेट अप में बताया गया है :

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id" 
        android:value="@string/default_notification_channel_id" />

फिर मान / strings.xml फ़ाइल में चैनल नाम के साथ एक पंक्ति जोड़ें :

<string name="default_notification_channel_id">default</string>

उसके बाद आप NotificationCompat.Bilder कंस्ट्रक्टर के नए संस्करण को 2 मापदंडों के साथ उपयोग कर पाएंगे (क्योंकि पुराने पैरामीटर को 1 पैरामीटर के साथ Android Oreo में हटा दिया गया है):

private void sendNotification(String title, String body) {
    Intent i = new Intent(this, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pi = PendingIntent.getActivity(this,
            0 /* Request code */,
            i,
            PendingIntent.FLAG_ONE_SHOT);

    Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, 
        getString(R.string.default_notification_channel_id))
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(title)
            .setContentText(body)
            .setAutoCancel(true)
            .setSound(sound)
            .setContentIntent(pi);

    NotificationManager manager = 
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    manager.notify(0, builder.build());
}

1
यह कैसे सरल है? : S
Nactus

17

यहाँ नमूना कोड है, जो Android Oreo में काम कर रहा है और Oreo से कम है।

  NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationCompat.Builder builder = null;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                int importance = NotificationManager.IMPORTANCE_DEFAULT;
                NotificationChannel notificationChannel = new NotificationChannel("ID", "Name", importance);
                notificationManager.createNotificationChannel(notificationChannel);
                builder = new NotificationCompat.Builder(getApplicationContext(), notificationChannel.getId());
            } else {
                builder = new NotificationCompat.Builder(getApplicationContext());
            }

            builder = builder
                    .setSmallIcon(R.drawable.ic_notification_icon)
                    .setColor(ContextCompat.getColor(context, R.color.color))
                    .setContentTitle(context.getString(R.string.getTitel))
                    .setTicker(context.getString(R.string.text))
                    .setContentText(message)
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setAutoCancel(true);
            notificationManager.notify(requestCode, builder.build());

8

सरल नमूना

    public void showNotification (String from, String notification, Intent intent) {
        PendingIntent pendingIntent = PendingIntent.getActivity(
                context,
                Notification_ID,
                intent,
                PendingIntent.FLAG_UPDATE_CURRENT
        );


        String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_DEFAULT);

            // Configure the notification channel.
            notificationChannel.setDescription("Channel description");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
            notificationChannel.enableVibration(true);
            notificationManager.createNotificationChannel(notificationChannel);
        }


        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
        Notification mNotification = builder
                .setContentTitle(from)
                .setContentText(notification)

//                .setTicker("Hearty365")
//                .setContentInfo("Info")
                //     .setPriority(Notification.PRIORITY_MAX)

                .setContentIntent(pendingIntent)

                .setAutoCancel(true)
//                .setDefaults(Notification.DEFAULT_ALL)
//                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
                .build();

        notificationManager.notify(/*notification id*/Notification_ID, mNotification);

    }

4
Notification notification = new Notification.Builder(MainActivity.this)
        .setContentTitle("New Message")
        .setContentText("You've received new messages.")
        .setSmallIcon(R.drawable.ic_notify_status)
        .setChannelId(CHANNEL_ID)
        .build();  

सही कोड होगा:

Notification.Builder notification=new Notification.Builder(this)

निर्भरता 26.0.1 और नए अद्यतन निर्भरता जैसे 28.0.0 के साथ।

कुछ उपयोगकर्ता इस कोड का उपयोग इस रूप में करते हैं:

Notification notification=new NotificationCompat.Builder(this)//this is also wrong code.

तो लॉजिक यह है कि आप किस विधि को घोषित करेंगे या उसमें कमी करेंगे, फिर राइट साइड में वही मैथोड अलोकेशन के लिए उपयोग किया जाएगा। यदि लेफ़्टसाइड ऑफ़ = में आप कुछ विधि का उपयोग करेंगे तो नए के साथ आवंटन के लिए उसी विधि का उपयोग दाईं ओर = के लिए किया जाएगा।

इस कोड को आज़माएं ... यह निश्चित रूप से काम करेगा


1

यह कंस्ट्रक्टर एपीआई स्तर 26.1.0 में पदावनत किया गया था। इसके बजाय NotificationCompat.Builder (संदर्भ, स्ट्रिंग) का उपयोग करें। सभी पोस्ट किए गए नोटिफिकेशन में NotificationChannel Id निर्दिष्ट करनी चाहिए।


हो सकता है कि कॉपी कैट के बजाय प्रलेखन के लिंक के साथ एक टिप्पणी जोड़ें और उत्तर के रूप में पोस्ट करें।
जैकसनऑफ़

0
  1. Notification_Channel_ID के साथ एक अधिसूचना चैनल घोषित करने की आवश्यकता है
  2. उस चैनल आईडी के साथ अधिसूचना बनाएं। उदाहरण के लिए,

...
 public static final String NOTIFICATION_CHANNEL_ID = MyLocationService.class.getSimpleName();
...
...
NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID,
                NOTIFICATION_CHANNEL_ID+"_name",
                NotificationManager.IMPORTANCE_HIGH);

NotificationManager notifManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

notifManager.createNotificationChannel(channel);


NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(getString(R.string.notification_text))
                .setOngoing(true)
                .setContentIntent(broadcastIntent)
                .setSmallIcon(R.drawable.ic_tracker)
                .setPriority(PRIORITY_HIGH)
                .setCategory(Notification.CATEGORY_SERVICE);

        startForeground(1, builder.build());
...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.