कैसे ठीक करें: android.app.RemoteServiceException: पैकेज से खराब सूचना *: आइकन नहीं बना सका: StatusBarIcon


127

मैं क्रैश लॉग में निम्नलिखित अपवाद देख रहा हूं:

android.app.RemoteServiceException: Bad notification posted from package com.my.package: Couldn't create icon: StatusBarIcon(pkg=com.my.package user=0 id=0x7f02015d level=0 visible=true num=0 )
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1456)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:146)
    at android.app.ActivityThread.main(ActivityThread.java:5487)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
    at dalvik.system.NativeStart.main(Native Method)

मैं निम्नलिखित विधि का उपयोग करके AlarmManager के माध्यम से एक लंबित सेट से एक IntentService से मेरी अधिसूचना पोस्ट कर रहा हूँ। यहां दिए गए सभी मान PendingIntent / IntentService में बंडल एक्स्ट्रा से हैं।

/**
 * Notification 
 *
 * @param c
 * @param intent
 * @param notificationId
 * @param title
 * @param message
 * @param largeIcon
 * @param smallIcon
 */
public static void showNotification(Context c, Intent intent,
        int notificationId, String title, String message, int largeIcon,
        int smallIcon) {
    PendingIntent detailsIntent = PendingIntent.getActivity(c,
            notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    // BUILD
    NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
            c);
    // TITLE
    mNotifyBuilder.setContentTitle(title).setContentText(message);

    // ICONS
    mNotifyBuilder.setSmallIcon(smallIcon);
    if (Util.isAndroidOSAtLeast(Build.VERSION_CODES.HONEYCOMB)) {
        Bitmap large_icon_bmp = ((BitmapDrawable) c.getResources()
                .getDrawable(largeIcon)).getBitmap();
        mNotifyBuilder.setLargeIcon(large_icon_bmp);
    }

    mNotifyBuilder.setContentIntent(detailsIntent);
    mNotifyBuilder.setVibrate(new long[] { 500, 1500 });
    mNotifyBuilder.setTicker(message);
    mNotifyBuilder.setContentText(message);

    // NOTIFY
    NotificationManager nm = (NotificationManager) c
            .getSystemService(Context.NOTIFICATION_SERVICE);
    nm.notify(notificationId, mNotifyBuilder.build());
}

मैंने जो अन्य उत्तर देखे हैं, उनमें से - जो अपवाद मैं देख रहा हूं वह तब होता है जब setSmallIcon()इसे ठीक से नहीं बुलाया जाता है।

मैंने जाँच की है और डबल चेक किया है कि रिसोर्स आईडी को पास किया जा रहा है।


3
मैं एक ही त्रुटि (लाइव ऐप से क्रैश रिपोर्ट) का अनुभव कर रहा हूं। मैं इसे अपने डिवाइस पर पुन: पेश नहीं कर सकता। मैं वर्तमान में यह सोच रहा हूँ क्योंकि लोग .apk को संशोधित करते हैं
काला कर दें

दोस्तों, किस तरीके से मैं इस समस्या को हल कर सकता हूं। मैं pngs का उपयोग करता हूं, लेकिन बहुत ही कम ऐप क्रैश करता है
user7856586

जवाबों:


98

क्या हो रहा था, मैं PendingIntent बंडल में आइकन के पूर्णांक संदर्भ को शामिल कर रहा था, और उस पूर्णांक को बाद में NotificationManager पर पोस्ट किया जा रहा था।

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


8
विचित्र। दूसरे शब्दों में, यह ठीक नहीं है? मैं अपने ऐप में वही क्रैश देख रहा हूं।
मथायस

यह तय करने योग्य नहीं लगता है। मैं, भविष्य में, भविष्य में छवियों के साथ सूचनाएं पोस्ट करने के बारे में जाने के लिए एक अलग तरीका तैयार करना होगा ....
FishStix

क्या होगा अगर हम रिमोट व्यू के टेक्स्ट को सेट करने की कोशिश करते हैं जैसे कि ret.setInt (id, "setTextSize", 20); इससे दुर्घटना भी होती है। मुझे पता है कि हमें भी इकाइयाँ प्रदान करनी होंगी, लेकिन मैं इस तरह के हस्ताक्षर कैसे करूँ। कोई सूचक ??
बिटाभि २ bits ’

1
क्या ऐप को अपडेट करने के लिए नोटिफिकेशन और उससे जुड़ी हर चीज को क्लियर किया जा सकता है? (यह मानते हुए कि ऐप समस्या से बच जाएगा)
NoHarmDan

3
यदि आप R.drawable.my_image को संदर्भित करना चाहते हैं, तो इसे एक स्ट्रिंग के रूप में बंडल में सहेजने के लिए सुरक्षित है ( bundle.putString("img", "my_image")और तब परिवर्तित करें जब जरूरत पड़ने पर वास्तविक @DrawableRes पूर्णांक निम्नानुसार हो:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
vanomart

52

VectorXmlआपके नोटिफिकेशन का उपयोग करके इस समस्या का कारण जाना जाता है। Png का प्रयोग करें


4
केवल पीएनजी का उपयोग किया जा रहा था।
फिशस्टिक्स

मेरे मामले में, मैं में वेक्टर था drawableफ़ोल्डर और में png का drawable-hdpi, xhdpiआदि लेकिन के लिए कोई png वहाँ था drawable-mdpi, और उसे एक नोटिफिकेशन पोस्ट करने हेतु MDPI डिवाइस पर दुर्घटनाग्रस्त हो गया।
वादिम Kotov

34

किटकैट पर एसवीजी का उपयोग न करें!

मेरे पास हर बार यही मुद्दा था जब मैं किटकैट पर एक अधिसूचना दिखाना चाहता था। मेरे लिए समस्या यह है कि मैंने xml (svg से), छोटे आइकन और एक्शन आइकन में भी हर आइकन को परिभाषित किया है। के बाद मैंने उन्हें png-s के साथ बदल दिया है समस्या मेरी तरफ हल हो गई है।


4
मैं पुष्टि कर सकता हूं। सूचनाओं में सदिश आरेख किटकैट पर RemoteServiceException का कारण बनते हैं।
खिजनी एंड्रे

2
किटकैट के मामले में, समस्या का समाधान तब किया गया जब मैंने XML को PNG के साथ बदल दिया: नया NotificationCompat.Builder (संदर्भ, CHANNEL_ID) .setSmallIcon (R.drawable.my_icon
एंड्रयू Glukhoff

1
इसने मेरे लिए काम किया। मैं एपीआई 19 चला रहा था और अधिसूचना आइकन के लिए एक एसवीजी फ़ाइल का उपयोग करता था और मुझे यह त्रुटि दे रहा था, जब तक कि मैंने इसे एक छोटे पीएनजी आइकन पर नहीं बदल दिया
WHOATEMYNOODLES

10

android.app.RemoteServiceException: खराब सूचना पोस्ट की गई

मेरे पास एक ही मुद्दा था, लेकिन मुझे हल कर दिया गया। मेरी समस्या दूरस्थ दृश्य की ".xml फ़ाइल" है।

मेरी xml फ़ाइल में मैं विभक्त के Viewबीच में एक जोड़ा गया था LinearLayout

<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:id="@+id/view"
    android:background="#000000" />

उपरोक्त Viewघटक खराब अधिसूचना अपवाद का निर्माण करते हैं। यह अपवाद कारण दूरस्थ साक्षात्कार की केवल xml फ़ाइल है।

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

तो आप RemoteViewवस्तु की .xml फ़ाइल में उपरोक्त दृश्य की तरह कोई भी चीज़ आकर्षित नहीं करते हैं ।


9

मेरी समस्या यह थी कि मैं जिस आइकन का उपयोग कर रहा था

.setSmallIcon(R.drawable.ic_stat_push_notif)

तदनुसार उत्पन्न नहीं हुआ था। आधिकारिक डॉक्टर के अनुसार :

जैसा कि घनत्व-विशिष्ट चिह्न सेट प्रदान करने और कई स्क्रीन का समर्थन करने में वर्णित है, आपको निम्न, मध्यम-, उच्च- और अतिरिक्त-उच्च-घनत्व स्क्रीन सहित सभी सामान्यीकृत स्क्रीन घनत्वों के लिए अलग-अलग चिह्न बनाने चाहिए। यह सुनिश्चित करता है कि आपके आइकन उन उपकरणों की श्रेणी में ठीक से प्रदर्शित होंगे, जिन पर आपका एप्लिकेशन इंस्टॉल किया जा सकता है।

तो उपरोक्त को पूरा करने का सबसे अच्छा तरीका है, मैंने https://www.annannik.github.io/AndroidAssetStudio/index.html पर रोमन नुरिक द्वारा प्रदान की गई अधिसूचना जेनरेटर का उपयोग किया।

उस तरह से, आप एक छवि का उपयोग कर सकते हैं (ध्यान में रखते हुए कि यह पारदर्शी पृष्ठभूमि है) और जनरेटर को अधिसूचना आइकनों के लिए विभिन्न आकारों को उत्पन्न करने के लिए काम करने दें।

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


2
मेरे मामले में, मैं में वेक्टर था drawableफ़ोल्डर और में png का drawable-hdpi, xhdpiआदि लेकिन के लिए कोई png वहाँ था drawable-mdpi, और उसे एक नोटिफिकेशन पोस्ट करने हेतु MDPI डिवाइस पर दुर्घटनाग्रस्त हो गया।
वादिम

7

मेरे ऐप में, इस तरह का बग अपग्रेड के दौरान ही होता है। यदि नए संस्करण में संसाधन आईडी बदल जाती है, तो एंड्रॉइड RemoteViewसंसाधन खोजने और बाहर फेंकने में विफल हो सकता है RemoteServiceException। यदि आप तीसरा संस्करण प्रकाशित करते हैं और संसाधन आईडी नहीं बदलते हैं, तो कीड़े केवल अस्थायी रूप से गायब हो सकते हैं ।

संपादन द्वारा res/values/public.xmlऔर इस तरह के कीड़ों को कम करना संभव है res/values/ids.xml। संकलक एक व्यक्ति संसाधन आईडी उत्पन्न होगा यदि संसाधन आईडी में नहीं है public.xmlया ids.xml। जब आप संसाधन का नाम बदलते हैं या कुछ नए संसाधन जोड़ते हैं, तो आईडी बदल सकती है और कुछ डिवाइस इसे खोजने में विफल हो सकते हैं।

तो चरण इस प्रकार है:

  1. Apk फ़ाइल को डिकम्पाइल करें और res/valuesढूँढें में public.xmlऔरids.xml
  2. अपने ऐप में RemoteView से संबंधित सभी संसाधन खोजें और उन्हें कॉपी करें (स्ट्रिंग, डिमेन, ड्रा करने योग्य, लेआउट, आईडी, रंग ...)
  3. बनाएं public.xmlऔर ids.xmlतहत res/valuesअपने स्रोत कोड में और लाइनों यू बस की नकल की पेस्ट

ध्यान दें:

1.3.0 और उससे ऊपर के ग्रेड को स्थानीय अनदेखा करें public.xml। इसे काम करने के लिए, आपको अपनी स्क्रिप्ट में कुछ जोड़ने की आवश्यकता हैbuild.gradle

afterEvaluate {
    for (variant in android.applicationVariants) {
        def scope = variant.getVariantData().getScope()
        String mergeTaskName = scope.getMergeResourcesTask().name
        def mergeTask = tasks.getByName(mergeTaskName)
        mergeTask.doLast {
            copy {
                int i=0
                from(android.sourceSets.main.res.srcDirs) {
                    include 'values/public.xml'
                    rename 'public.xml', (i == 0? "public.xml": "public_${i}.xml")
                    i++
                }
                into(mergeTask.outputDir)
            }
        }
    }
}

नोट: यह स्क्रिप्ट सबमॉडल्स प्रोजेक्ट का समर्थन नहीं करता है। मैं इसे ठीक करने की कोशिश कर रहा हूं।


3

आपके पास एक ही आइकन है

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

और आप सूचना दें

 NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this, channelId)
                        .setSmallIcon(R.drawable.ic_stat_name)
                        .setContentTitle("Title")
                        .setContentText(messageBody)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);

2
मैंने वेक्टर छवि को एक संसाधन के रूप में पारित किया है और मुझे लगता है कि यह वनप्लस / एंड्रॉइड 6 उपकरणों पर क्रैश का कारण बना। 100% के लिए निश्चित नहीं है।
एलेक्सी

3

यदि आइकन महत्वपूर्ण नहीं है, तो आप बदल सकते हैं,

R.drawable.your_icon

सेवा

android.R.drawable.some_standard_icon

यह काम!


2

जब मेरी कक्षा में Notification का उपयोग FirebaseMessagingService से हुआ, तो मेरे पास RemoteServiceException थी। मैंने AndroidManifest.xml में निम्न कोड जोड़ा:

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

इसके अलावा संसाधन ic_small एक वर्ग अधिसूचना के उदाहरण में सेट किया गया है।


इस मेटाडेटा को <सेवा </ सेवा> टैग के अंदर जोड़ना होगा?
एंड्री

2

एंड्रॉइड स्टूडियो संस्करण 3.0.0 और इसके बाद के संस्करण में, ड्रॉबल्स फ़ोल्डर में एक नई छवि जोड़ते समय, ड्रॉएबल-वी 24 के बजाय ड्रॉबल का चयन करें।यहाँ छवि विवरण दर्ज करें

यदि आप जिस छवि का उपयोग कर रहे हैं, वह एक (v24) को पूर्ववत कर रही है और इसे उसी निर्देशिका में पेस्ट करें (जैसे। ड्रॉबल्स)। इस बार यह आपसे पूछेगा कि कौन सा नियमित या v24 है - बस सुनिश्चित करें कि इसका v24 नहीं है और इसे फिर से आज़माएं, इससे त्रुटि ठीक होनी चाहिए।


सूचना - यदि आप "एंड्रॉइड" दृश्य में हैं, तो इसे "प्रोजेक्ट" दृश्य में स्विच करें। एंड्रॉइड दृश्य में, आप
ड्रॉबल्स v24

2

एक ही मुद्दा मेरे साथ भी हुआ और मैंने एक ही हल किया है

REASON : ऐसा इसलिए हो रहा है क्योंकि हम रिमोट व्यू के लिए वेक्टर ड्रॉबल का उपयोग कर रहे हैं और कॉम्पेक्ट-टाइम पर वेक्टर ड्रिबल जेनरेट करने योग्य है। इसके अलावा, मुझे यकीन नहीं है कि कुछ डिवाइस जेनरेट किए जा सकने योग्य संसाधन आईडी का पता लगाने में सक्षम नहीं हैं, जबकि हम ऐप को खोल रहे हैं। लेकिन हाँ यही कारण था।

सुधार चरण 1. पिछले निर्माण स्थापित करें। 2. एक सूचना भेजें 3. अगले संस्करण कोड के साथ बिल्ड को अपडेट करें। 4. अपडेट करने के बाद ऐप को न खोलें और फिर से अधिसूचना भेजें

समाधान वेक्टर ड्रॉबल को सामान्य ड्रॉबल (.png या .jpg) फ़ाइल से बदलें।

मुझे उम्मीद है कि यह समस्या को हल करता है।


1

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

 <receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_CHANGED" />
    </intent-filter>
</receiver>

0

मेरे पास एक ही मुद्दा था जब मैंने एक बंडल में एक अधिसूचना निर्धारित की। मैंने यह कोशिश की और इसने मेरी समस्या हल कर दी:

builder.setLargeIcon(large_icon);
builder.setSmallIcon(R.drawable.small_icon);

सुनिश्चित करें कि setLargeIcon () setSmallIcon () से पहले लागू किया गया है।


4
यह मदद क्यों करनी चाहिए?
18

0

मेरा भी यही मुद्दा था। समस्या उस आइकन के साथ है जिसका आप उपयोग कर रहे हैं, मैं android.R.drawable.stat_sys_download का उपयोग कर रहा था। Drawables.xml पर जाएं और इसे पेस्ट करें।

<resources>
 <item name="ic_start_download" type="drawable">@android:drawable/stat_sys_download</item>
</resource>

और फिर अपने कोड में

builder.setSmallIcon(R.drawable.ic_start_download);

आप इस छवि के बजाय कुछ अन्य छवि आज़मा सकते हैं


0

इसे हल करने का मेरा तरीका: मेरे लेआउट में "बुरे" विचार थे (उदाहरण: एक चेकबॉक्स) - इसलिए मैंने उन्हें हटा दिया।

RemoteViews केवल छवियों और ग्रंथों का समर्थन करने के लिए लगता है (डॉक् पढ़कर पुष्टि की जा सकती है)।


0

Android.support.constraint.ConstraintLayout का उपयोग करते समय मेरे पास RemoteServiceException थी। इसे LinearLayout या Relative में बदल दें और कंटेनर के लिए भी android: Layout_height = "wra_content"


0

(यह वर्तमान प्रश्न के लिए समाधान नहीं है, लेकिन इसी तरह के मूल मुद्दे के साथ किसी की मदद करता है) मेरे पास भी यही मुद्दा था, लेकिन मेरे मामले में मैंने भ्रष्ट। png फ़ाइल का उपयोग किया है जो समान समस्या पैदा कर रहा है। इसलिए मैंने इसे हटा दिया है और सही .png फ़ाइल को फिर से शामिल किया है।


0

की जगह कृपया <android.support.v7.widget.AppCompatTextViewके साथ <TextViewकस्टम सूचना लेआउट से।

क्योंकि android.support.v7.widget.AppCompatTextViewया android.support.v7.widget.AppCompatImageViewकेवल रनटाइम पर काम करता है।

तो उपयोग करें TextViewयाImageView


0

यदि कोई भी अभी भी इस समस्या का सामना कर रहा है: अपने drawable फ़ोल्डर में नाम के साथ एक png फ़ाइल जोड़ें ic_stat_ic_notification (या कोई भी नाम जैसे u)

और अपने प्रकटीकरण में कुछ पंक्तियों के नीचे जोड़े

और आप यहां अपना आइकन बना सकते हैं -> https://romannurik.github.io/AndroidAssetStudio/icon


0

प्रोजेक्ट को सिंक्रोनाइज़ करें और उसे क्लीन करने के बजाय, फ़ाइल> फिर सिंक्रोनाइज़ करें: बिल्ड> क्लीन प्रोजेक्ट

मुझे उम्मीद है कि आप सभी की मदद करेंगे, यह मेरे लिए काम कर रहा है


0

मुझे यह त्रुटि ऑटोलिंक और लिंक्स के कारण मिली है। अधिसूचना दृश्य में टेक्स्टव्यू में क्लिक करने योग्य विकल्प:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:autoLink="all"
        android:linksClickable="true"
        android:text="@string/app_name"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/white" />

सावधान रहे!


-3

इसने मेरे लिए काम किया । आइकन के संदर्भ में टिप्पणी करें और इस प्रकार समस्याओं के बिना NotificationCompat.Bilder का उपयोग करने में सक्षम हो।

    $msg_notificacion = [
                        'title'         => "titulonotif",
                       // "icon" : "myicon",
                        'body'          =>"cuerponotif"
                    ];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.