android - एफसीएम डिफ़ॉल्ट आइकन अमान्य ढाल का उपयोग करता है




firebase firebase-cloud-messaging (4)

एंड्रॉइड मैनिफेस्ट का डिफ़ॉल्ट एफसीएम आइकन इस्तेमाल नहीं किया जाता है। इसके बजाय एंड्रॉइड स्टैंडअर्ट आइकन का उपयोग किया जाता है। लॉगकैट में यह कहता है:

ई / फायरबेस मैसेजिंग: आईडी के साथ आइकन: 2131230849 एक अवैध ढाल का उपयोग करता है। फ़ॉलबैक आइकन का उपयोग करना।

डिफ़ॉल्ट आइकन में केवल एक रंग होता है। मैंने इसे कई अलग-अलग आइकन के साथ परीक्षण किया लेकिन हमेशा एंड्रॉइड स्टैंडअर्ट आइकन का उपयोग किया जाता है।


V12.0.0 के साथ फिक्स्ड: firebase.google.com/support/release-notes/android#20180320

फिक्स्ड एक रिग्रेशन फिक्स्ड है जिसके कारण एंड्रॉइड 8.0 पर कस्टम अधिसूचना आइकन खारिज कर दिए गए हैं।


अद्यतन: संस्करण 12.0.0 में फायरबेस द्वारा तय किया गया

नीचे दिए गए दोषपूर्ण कोड को इसके साथ अपडेट किया गया है और यह मेरे मूल उत्तर में उल्लिखित बग को रोकने के दौरान 8.0 पर बहुत अच्छा काम करता है।

@TargetApi(26)
private final boolean zza(int var1) {
    if(VERSION.SDK_INT != 26) {
        return true;
    } else {
        try {
            if(this.zzb.getResources().getDrawable(var1, (Theme)null) instanceof AdaptiveIconDrawable) {
                Log.e("FirebaseMessaging", (new StringBuilder(77)).append("Adaptive icons cannot be used in notifications. Ignoring icon id: ").append(var1).toString());
                return false;
            } else {
                return true;
            }
        } catch (NotFoundException var2) {
            return false;
        }
    }
}

यह इस मुद्दे को हल नहीं करता है, लेकिन टिप्पणियों से मुझे इसे उत्तर के रूप में रखने के लिए कहा गया था। यहां फ़ायरबेस 11.8.0 का कोड है जो अपराधी है और केवल एंड्रॉइड 8.0 (एपीआई 26) पर है। इस चेक का कारण यह है क्योंकि अनुकूलक आइकन के साथ एक एंड्रॉइड 8.0 अधिसूचना बग है https://www.bleepingcomputer.com/news/mobile/android-oreo-adaptive-icons-bug-sends-thousands-of-phones-into-infinite-boot-loops/ इसलिए यह कोड उस से रोकता है, लेकिन ऐसा करने में, गैर-अनुकूली आइकन ठीक से दिखने से रोकता है

    @TargetApi(26)
private final boolean zzid(int var1) {
    if(VERSION.SDK_INT != 26) {
        return true;
    } else {
        try {
            Drawable var2;
            if((var2 = this.mContext.getResources().getDrawable(var1, (Theme)null)).getBounds().height() != 0 && var2.getBounds().width() != 0) {
                return true;
            } else {
                Log.e("FirebaseMessaging", (new StringBuilder(72)).append("Icon with id: ").append(var1).append(" uses an invalid gradient. Using fallback icon.").toString());
                return false;
            }
        } catch (NotFoundException var3) {
            return false;
        }
    }
}

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

दक्षिणप्रॉप से ​​एक और टिप्पणी के अनुसार, फायरबेस टीम इस मुद्दे से अवगत है और एक फिक्स पर काम कर रही है लेकिन कोई समयरेखा नहीं दी गई है।

यह कोड 11.6.0 और उससे कम नहीं है, इसलिए यदि आपको वास्तव में समय के लिए इस काम की ज़रूरत है, तो अपने फायरबेस को डाउनग्रेड करें।

उम्मीद है कि यह उन लोगों की सहायता करता है जो इस पोस्ट को त्रुटि के लिए खोजते हैं


एंड्रॉइड स्टूडियो का संस्करण क्या है? एंड्रॉइड स्टूडियो 3.0 नई आइकन डिज़ाइन सुविधा के साथ काम करता है एंड्रॉइड स्टूडियो 3.0 से शुरू होता है। यदि आप एंड्रॉइड स्टूडियो 3.0 या उससे ऊपर का उपयोग कर रहे हैं तो नए वेक्टर या छवि संपत्ति को जोड़ने के लिए ड्रॉइंग फ़ोल्डर पर जाएं और संदर्भ मेनू पर कॉल करें। विरासत टैब की तलाश करें, जो एंड्रॉइड स्टूडियो के पुराने संस्करण की एक ही सेटिंग या सुविधा है।


यह बग तभी होता है जब आपका एप्लिकेशन लक्ष्यीकरण API 26 (या अधिक) और आप फ़ायरबेस 11.8.0 का उपयोग करें और इसे एंड्रॉइड 8.0 के साथ डिवाइस पर लॉन्च करें। तो मैंने केवल इन संस्करणों के लिए इसे ठीक करने का फैसला किया। कामकाज: आपको आवेदन कक्षा को ओवरराइड करना चाहिए और इसे प्राप्त करना चाहिए स्रोतों () पैच किए जाने के लिए संसाधन वर्ग:

@Override public Resources getResources() {
    if (resources == null) {
        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O) {
            resources = new ResourcesForSupportFirebaseNotificationsOnAndroid8(super.getResources());
        } else {
            resources = super.getResources();
        }
    }
    return resources;
}

और आपको हमारे उद्देश्यों के लिए पैच बनाना चाहिए संसाधन वर्ग:

public class ResourcesForSupportFirebaseNotificationsOnAndroid8 extends Resources {

    private final Resources resources;

    public ResourcesForSupportFirebaseNotificationsOnAndroid8(final Resources resources) {
        super(resources.getAssets(), resources.getDisplayMetrics(), resources.getConfiguration());
        this.resources = resources;
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override public Drawable getDrawable(final int id, @Nullable final Theme theme) throws NotFoundException {
        if (id == R.drawable.ic_firebase_notification) {
            final Drawable drawable = resources.getDrawable(id, theme);
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
            return drawable;
        } else {
            return resources.getDrawable(id, theme);
        }
    }
}

और जांचें कि आपके AndroidManifest.xml में यह मेटा-डेटा है:

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

यदि आप एंड्रॉइड 8.0 पर सभी अधिसूचनाओं के वर्णन के अनुसार करेंगे, जो फायरबेस एसडीके द्वारा प्रस्तुत किया जाएगा, डिफ़ॉल्ट आइकन @ drawable / ic_firebase_notification के साथ दिखाया जाएगा

लेकिन मुझे आशा है कि फायरबेस टीम अपनी हानिकारक जांच को ठीक करे और पढ़ें कि यह कैसे काम करता है







firebase-cloud-messaging