नए फायरबेस क्लाउड मैसेजिंग सिस्टम के साथ अधिसूचना आइकन


132

कल Google ने Google I / O को नए फायरबेस पर आधारित नई अधिसूचना प्रणाली में प्रस्तुत किया। मैंने इस नए FCM (फायरबेस क्लाउड मेसेजिंग) को जीथब पर उदाहरण के साथ आज़माया।

अधिसूचना का आइकन हमेशा ic_launcher होता है, इसके बावजूद कि मैंने एक विशिष्ट ड्रॉबल घोषित किया है

क्यों ? संदेश को संभालने के लिए आधिकारिक कोड के नीचे

public class AppFirebaseMessagingService extends FirebaseMessagingService {

    /**
     * Called when message is received.
     *
     * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // If the application is in the foreground handle both data and notification messages here.
        // Also if you intend on generating your own notifications as a result of a received FCM
        // message, here is where that should be initiated. See sendNotification method below.
        sendNotification(remoteMessage);
    }
    // [END receive_message]

    /**
     * Create and show a simple notification containing the received FCM message.
     *
     * @param remoteMessage FCM RemoteMessage received.
     */
    private void sendNotification(RemoteMessage remoteMessage) {

        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

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

// this is a my insertion looking for a solution
        int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.myicon: R.mipmap.myicon;
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(icon)
                .setContentTitle(remoteMessage.getFrom())
                .setContentText(remoteMessage.getNotification().getBody())
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

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

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }

}

फायरबेस का कोई लेना-देना नहीं है कि आप अधिसूचना कैसे बना रहे हैं, कृपया एक छवि प्रदान करें कि आप क्या देख रहे हैं
tyczj

1
सटीक। यह कोड सीधे Firebase से आता है और sendNotification () विधि किसी भी अधिसूचना के लिए बिल्कुल समान है। यह कोड GCM के साथ ठीक काम करता है, लेकिन FCM सं। यह हमेशा ic_launcher बनी हुई है, नए वेब इंटरफ़ेस का उपयोग कर संदेश भेजने के लिए
मार्को

जब तक आप धक्का पेलोड में अधिसूचना टैग के साथ एक धक्का नहीं भेज रहे हैं, तब तक आप छोटे आइकन को सेट करते हैं, लेकिन बड़े आइकन को नहीं, इसका एफसीएम से कोई लेना-देना नहीं है
tyczj

ऐप के अग्रभूमि में होने पर क्या यह आपका कस्टम नोटिफिकेशन आइकन दिखाता है? ये मेरे लिए सही है। हालाँकि, जब एप्लिकेशन बैकग्राउंड में होता है तो उसे किसी प्रकार के डिफ़ॉल्ट FCM हैंडलर का उपयोग करना चाहिए, क्योंकि सभी अधिसूचना सेटिंग्स को अनदेखा किया जाता है (आइकन, ध्वनि, रोशनी, कंपन, आदि को अनुकूलित नहीं किया जा सकता है)।
shinypenguin

जवाबों:


267

दुर्भाग्य से यह एसडीके 9.0.0-9.6.1 में फायरबेस नोटिफिकेशन की एक सीमा थी। जब एप्लिकेशन बैकग्राउंड में होता है, तो कंसोल से भेजे गए संदेशों के लिए लॉन्चर (अपेक्षित एंड्रॉइड टिनिंग के साथ) से लॉन्चर आइकन का उपयोग किया जाता है।

SDK 9.8.0 के साथ, आप डिफ़ॉल्ट को ओवरराइड कर सकते हैं! अपने AndroidManifest.xml में आप आइकन और रंग को अनुकूलित करने के लिए निम्नलिखित फ़ील्ड सेट कर सकते हैं:

<meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/notification_icon" />
<meta-data android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/google_blue" />

ध्यान दें कि यदि ऐप अग्रभूमि में है (या डेटा संदेश भेजा जाता है) तो आप डिस्प्ले को कस्टमाइज़ करने के लिए अपने स्वयं के तर्क का पूरी तरह से उपयोग कर सकते हैं। यदि आप HTTP / XMPP API से संदेश भेजते हैं, तो आप हमेशा आइकन को कस्टमाइज़ कर सकते हैं।


1
@ इयान बार्बर: निकट भविष्य में इस व्यवहार को बदलने के लिए Google पर कोई योजना?
skylve

1
टीम इस मुद्दे से अवगत है और एक फिक्स पर काम कर रही है।
आर्थर थॉम्पसन

1
इस पर किसी भी अद्यतन? मैंने सोचा कि मैं पूछता हूँ क्योंकि ऐसी परिस्थितियाँ आई हैं जब एक Google इंजीनियर केवल पैच पुश करना भूल गया था।
सीक्यूएम

7
आह, मुझे यह 9.8.0 के साथ काम करने के लिए मिला। दूसरों की मदद करने के लिए, अपने स्टेटस बार आइकन को ज़रूर याद रखें: डेवलपर . android.com/guide/practices/ui_guidelines/… । मेरा नहीं था और इसलिए मानक दृश्य में निर्दिष्ट आइकन का उपयोग करने के बजाय मानक व्हाट्सएप को फायरबेस को हटा दिया।
ज़ैफ्रन

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

35

अपने क्लाइंट को संदेश भेजने के लिए सर्वर कार्यान्वयन का उपयोग करें और सूचना प्रकार के संदेशों के बजाय डेटा प्रकार के संदेशों का उपयोग करें ।

यह onMessageReceivedआपके कॉल बैकग्राउंड या अग्रभूमि में होने के बावजूद आपको कॉलबैक प्राप्त करने में मदद करेगा और आप तब अपना कस्टम नोटिफिकेशन तैयार कर सकते हैं


2
यह फायरबेस डॉक्स में भी सुझाया गया समाधान है, आप अधिसूचना को किसी भी तरह से दिखा सकते हैं जिसे आप पसंद करते हैं यदि आप अधिसूचना के बजाय डेटा पुश पर भरोसा करते हैं।
आरएसी

1
हाँ सहमत। इसे एक सही उत्तर के रूप में चिह्नित किया जाना चाहिए। या नीचे मेरा जवाब :)
विकसित करें

3
नहीं, यह उन लोगों के लिए संभव नहीं है जिन्हें अन्य क्लाइंट / विरासत संस्करणों के साथ संगतता बनाए रखने की आवश्यकता है जो एक अधिसूचना की उम्मीद करते हैं।
गाबोर

हमारे पास उत्पादन में एप्लिकेशन हैं जो पहले से ही सूचना के प्रकार की धक्का की उम्मीद करते हैं और हमने नए ग्राहकों के लिए डेटा जोड़ने के लिए उस (जटिल) बैकएंड घटक को बढ़ाया है। लेकिन हम अपने ऐप की विरासत संस्करणों के लिए समर्थन नहीं निकाल सकते।
गेबर

ओह मैं सहमत हूँ। यह एक और समस्या है। मैं एकीकृत करने से पहले डॉक्स को अच्छी तरह से पढ़ने का सुझाव दूंगा। उत्पादन को जारी करने से पहले अच्छी तरह से परीक्षण करने के लिए भी। लॉन्च से पहले ऐप का अच्छी तरह से परीक्षण करने पर समस्या से बचा जा सकता था। वैसे भी, आपके पास सीखने के लिए कुछ था।
गिकोराउल

9

एटीएम वे उस मुद्दे पर काम कर रहे हैं https://github.com/firebase/quickstart-android/issues/4

जब आप फायरबेस कंसोल से एक सूचना भेजते हैं, तो डिफ़ॉल्ट रूप से आपके ऐप आइकन का उपयोग होता है, और सूचना पट्टी में एंड्रॉइड सिस्टम उस आइकन को ठोस सफेद कर देगा।

यदि आप उस परिणाम से नाखुश हैं, तो आपको FirebaseMessagingService को लागू करना चाहिए और संदेश प्राप्त होने पर मैन्युअल रूप से सूचनाएं बनाएं। हम इसे सुधारने के लिए एक तरीके पर काम कर रहे हैं लेकिन अभी इसके लिए एक ही रास्ता है।

संपादित करें: SDK 9.8.0 के साथ AndroidManifest.xml जोड़ें

<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/my_favorite_pic"/>

मार्शमॉलो में अनुकूलित आइकन अधिसूचना ट्रे कैसे प्रदर्शित करें
हर्षा

6

मेरा समाधान एटम के समान है, लेकिन इसे लागू करना आसान है। आपको एक वर्ग बनाने की ज़रूरत नहीं है जो पूरी तरह से FirebaseMessagingService को छाया करता है, आप बस उस पद्धति को ओवरराइड कर सकते हैं जो इंटेंट को प्राप्त करता है (जो सार्वजनिक है, कम से कम 9.6.1 संस्करण में) और एक्स्ट्रा से प्रदर्शित होने वाली जानकारी ले। "हैकी" भाग यह है कि विधि का नाम वास्तव में अस्पष्ट है और जब भी आप Firebase sdk को एक नए संस्करण में अपडेट करते हैं तो यह हर बार बदल जाता है, लेकिन आप Android Studio से FirebaseMessagingService का निरीक्षण करके और एक सार्वजनिक विधि की तलाश में इसे जल्दी से देख सकते हैं। एकमात्र पैरामीटर के रूप में एक आशय। 9.6.1 संस्करण में इसे zzm कहा जाता है। यहां बताया गया है कि मेरी सेवा कैसी दिखती है:

public class MyNotificationService extends FirebaseMessagingService {

    public void onMessageReceived(RemoteMessage remoteMessage) {
        // do nothing
    }

    @Override
    public void zzm(Intent intent) {
        Intent launchIntent = new Intent(this, SplashScreenActivity.class);
        launchIntent.setAction(Intent.ACTION_MAIN);
        launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* R    equest code */, launchIntent,
                PendingIntent.FLAG_ONE_SHOT);
        Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),
                R.mipmap.ic_launcher);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_notification)
                .setLargeIcon(rawBitmap)
                .setContentTitle(intent.getStringExtra("gcm.notification.title"))
                .setContentText(intent.getStringExtra("gcm.notification.body"))
                .setAutoCancel(true)
                .setContentIntent(pendingIntent);

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

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

gcm.notification.title कुंजी नाम के लिए सभी संस्करणों के लिए 100% सुरक्षित है?
पडरोहो

3

बस targetSdkVersion को 19 पर सेट करें। सूचना आइकन रंगीन होगा। फिर इस समस्या को ठीक करने के लिए Firebase की प्रतीक्षा करें।


7
: वाह वाह, तो साइड इफेक्ट्स की सूची कहाँ है?
यूजेन पिंचेक

@EugenPechanec हाँ, व्यापार बंद है कि आप कुछ एपीआई का उपयोग करने में सक्षम नहीं हो सकते हैं जो 20+ पर उपलब्ध है
बेलेंग

3

एक बदसूरत लेकिन काम करने का तरीका भी है। Decompile FirebaseMessagingService.class और इसे संशोधित करें व्यवहार। फिर बस क्लास को आप यूटी एप में सही पैकेज पर रखें और डेक्स मैसेजिंग लिब में ही क्लास के बजाय इसका इस्तेमाल करें। यह काफी आसान और काम कर रहा है।

विधि है:

private void zzo(Intent intent) {
    Bundle bundle = intent.getExtras();
    bundle.remove("android.support.content.wakelockid");
    if (zza.zzac(bundle)) {  // true if msg is notification sent from FirebaseConsole
        if (!zza.zzdc((Context)this)) { // true if app is on foreground
            zza.zzer((Context)this).zzas(bundle); // create notification
            return;
        }
        // parse notification data to allow use it in onMessageReceived whe app is on foreground
        if (FirebaseMessagingService.zzav(bundle)) {
            zzb.zzo((Context)this, intent);
        }
    }
    this.onMessageReceived(new RemoteMessage(bundle));
}

यह कोड ९ .४.० संस्करण से है, विधि में भिन्न-भिन्न नामों के भिन्न-भिन्न नाम होने के कारण इसमें भिन्नता होगी।


3

यदि आपका ऐप बैकग्राउंड में है, तो नोटिफिकेशन आइकन ऑनएज मेसेज़ रिसीव विधि पर सेट हो जाएगा, लेकिन यदि आप ऐप को फोरग्राउंड करते हैं, तो नोटिफिकेशन आइकन वही होगा जो आपने मैनिफ़ेस्ट में परिभाषित किया था

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


2

मैं एफसीएम कंसोल और HTTP / JSON के माध्यम से ... उसी परिणाम के साथ अपनी सूचनाएं ट्रिगर कर रहा हूं।

मैं शीर्षक, पूर्ण संदेश को संभाल सकता हूं, लेकिन आइकन हमेशा एक डिफ़ॉल्ट सफेद सर्कल है:

अधिसूचना स्क्रीनशॉट

कोड में मेरे कस्टम आइकन के बजाय (सेटस्मॉलकॉन या सेटस्मॉलकॉन) या ऐप से डिफ़ॉल्ट आइकन:

 Intent intent = new Intent(this, MainActivity.class);
    // use System.currentTimeMillis() to have a unique ID for the pending intent
    PendingIntent pIntent = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), intent, 0);

    if (Build.VERSION.SDK_INT < 16) {
        Notification n  = new Notification.Builder(this)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pIntent)
                .setAutoCancel(true).getNotification();
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //notificationManager.notify(0, n);
        notificationManager.notify(id, n);
    } else {
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);

        Notification n  = new Notification.Builder(this)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setSmallIcon(R.drawable.ic_stat_ic_notification)
                .setLargeIcon(bm)
                .setContentIntent(pIntent)
                .setAutoCancel(true).build();

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //notificationManager.notify(0, n);
        notificationManager.notify(id, n);
    }

1
समझ गया! मेरे <सेवा> टैग <Application> से बाहर हैं AndroidManifest.xml में टैग यहां मैं जवाब stackoverflow.com/a/37352142/6366150 पर
गोंजालो

केवल अग्रभूमि ऐप के साथ काम करता है ... पृष्ठभूमि में अभी भी वही पिछला व्यवहार हो रहा है
गोंजालो

जब एप्लिकेशन में यह स्पष्ट हो कि कस्टोम नोटिफिकेशन आइकन nd ठीक काम कर रहा है, लेकिन ऐप बैकग्राउंड में वाइट स्क्वायर आइकन मिल रहा है तो कृपया मेरी मदद करें
Harsha

1

इसे लिखें

<meta-data 
         android:name="com.google.firebase.messaging.default_notification_icon"
         android:resource="@drawable/ic_notification" />

ठीक नीचे <application.....>

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


0

सोचा था कि मैं इस पर एक जवाब जोड़ दूंगा, क्योंकि मेरी समस्या आसान थी लेकिन नोटिस करना मुश्किल था। विशेष रूप से मैंने अपना निर्माण करते समय एक मौजूदा मेटा-डेटा तत्व को कॉपी / पेस्ट किया था com.google.firebase.messaging.default_notification_icon, जिसने android:valueइसके मूल्य को निर्दिष्ट करने के लिए एक टैग का उपयोग किया था । यह अधिसूचना आइकन के लिए काम नहीं करेगा, और एक बार जब मैंने इसे android:resourceअपेक्षित रूप से काम किया, तो इसे बदल दिया ।


वही default_notification_colorमेटा के लिए चला जाता है , यह एक होना चाहिए android:resource- सेटिंग के रूप में android:valueकाम नहीं करेगा
फ्लोट्टिलिलोच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.