วิธีแก้ไข: android.app.RemoteServiceException: การแจ้งเตือนที่ไม่ถูกต้องโพสต์จากแพ็คเกจ *: ไม่สามารถสร้างไอคอน: StatusBarIcon


128

ฉันเห็นข้อยกเว้นต่อไปนี้ในบันทึกข้อขัดข้อง:

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)

ฉันโพสต์การแจ้งเตือนของฉันจาก IntentService จากชุด PendingIntent ผ่าน AlarmManager โดยใช้วิธีการต่อไปนี้ ค่าทั้งหมดที่ส่งมาที่นี่มาจาก Bundle Extras ใน 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
มืดลง

พวกฉันจะแก้ปัญหานี้ได้อย่างไร ฉันใช้ png แต่ไม่ค่อยมีแอพขัดข้อง
user7856586

คำตอบ:


98

สิ่งที่เกิดขึ้นคือฉันรวมการอ้างอิงจำนวนเต็มไปยังไอคอนในกลุ่ม PendingIntent และจำนวนเต็มนั้นถูกอ้างอิงในภายหลังขณะที่โพสต์ไปยัง NotificationManager

ระหว่างการรับการอ้างอิงจำนวนเต็มและความตั้งใจที่รอดำเนินการอยู่นั้นแอปได้รับการอัปเดตและการอ้างอิงที่ดึงได้ทั้งหมดได้เปลี่ยนไป จำนวนเต็มที่ใช้อ้างอิงการเบิกจ่ายที่ถูกต้องในขณะนี้อ้างอิงทั้ง drawable ไม่ถูกต้องหรือไม่มีเลย (ไม่มีเลย - ทำให้เกิดข้อขัดข้อง)


8
แปลกประหลาด กล่าวอีกนัยหนึ่งสิ่งนี้ไม่สามารถแก้ไขได้ใช่หรือไม่? ฉันพบข้อขัดข้องเดียวกันในแอปของฉัน
Matthias

ดูเหมือนจะไม่สามารถแก้ไขได้ ในอนาคตฉันจะต้องคิดค้นวิธีที่แตกต่างออกไปเกี่ยวกับการโพสต์การแจ้งเตือนพร้อมรูปภาพในอนาคต ....
FishStix

จะเกิดอะไรขึ้นถ้าเราลองตั้งค่า textSize ของมุมมองระยะไกลเป็น ret.setInt (id, "setTextSize", 20); มันยังขัดข้อง ฉันรู้ว่าเราต้องจัดหาหน่วยด้วย แต่ฉันจะทำอย่างไรกับลายเซ็นวิธีดังกล่าว ตัวชี้ใด ๆ ??
bitsabhi

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
มีการใช้ PNG เท่านั้น
FishStix

ในกรณีของฉันฉันมีเวกเตอร์ในdrawableโฟลเดอร์และ png ในdrawable-hdpi, xhdpiฯลฯ แต่มี PNG ไม่มีdrawable-mdpiและมันกระแทกบนอุปกรณ์ MDPI การโพสต์การแจ้งเตือน
Vadim Kotov

34

อย่าใช้ SVG กับ Kitkat!

ฉันมีปัญหาเดียวกันทุกครั้งเมื่อต้องการแสดงการแจ้งเตือนใน Kitkat สิ่งที่ทำให้เกิดปัญหาสำหรับฉันคือฉันได้กำหนดทุกไอคอนใน xml (จาก svg) ไอคอนขนาดเล็กและไอคอนการกระทำด้วย หลังจากที่ฉันแทนที่ด้วย png-s ปัญหาได้รับการแก้ไขที่ด้านข้างของฉัน


4
ฉันสามารถยืนยันได้ Vector drawables ในการแจ้งเตือนทำให้เกิด RemoteServiceException บน KitKat
Khizhny Andrey

2
ในกรณีของ KitKat ปัญหาได้รับการแก้ไขเมื่อฉันแทนที่ XML ด้วย PNG ใน: NotificationCompat.Builder ใหม่ (บริบท CHANNEL_ID) .setSmallIcon (R.drawable.my_icon)
Andrew Glukhoff

1
สิ่งนี้ได้ผลสำหรับฉัน ฉันใช้ API 19 และใช้ไฟล์ SVG สำหรับไอคอนการแจ้งเตือนและให้ข้อผิดพลาดนี้แก่ฉันจนกระทั่งฉันเปลี่ยนเป็นไอคอน png ขนาดเล็ก
WHOATEMYNOODLES

10

android.app.RemoteServiceException: โพสต์การแจ้งเตือนที่ไม่ถูกต้อง

ฉันมีปัญหาเดียวกัน แต่ฉันได้รับการแก้ไขแล้ว ปัญหาของฉันคือ "ไฟล์. xml" ของมุมมองระยะไกล

ในไฟล์ xml ของฉันฉันถูกเพิ่มหนึ่งไฟล์Viewระหว่างLinearLayoutfor divider

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

Viewองค์ประกอบข้างต้นสร้างข้อยกเว้นการแจ้งเตือนที่ไม่ถูกต้อง เหตุผลข้อยกเว้นนี้เป็นเพียงไฟล์ xml ของ Remoteviews

หลังจากลบคอมโพเนนต์ View นั้นแล้วโค้ดของฉันก็ทำงานอย่างถูกต้องโดยไม่มีข้อยกเว้นใด ๆ ดังนั้นฉันรู้สึกว่าลิ้นชักการแจ้งเตือนไม่ยอมรับมุมมองที่กำหนดเอง

ดังนั้นคุณจะไม่วาดสิ่งใด ๆ เช่นมุมมองด้านบนในไฟล์. xml ของRemoteViewวัตถุ


9

ปัญหาของฉันคือไอคอนที่ฉันใช้อยู่

.setSmallIcon(R.drawable.ic_stat_push_notif)

ไม่ได้สร้างขึ้นตามนั้น ตามเอกสารอย่างเป็นทางการ :

ตามที่อธิบายไว้ในการจัดเตรียมชุดไอคอนเฉพาะความหนาแน่นและรองรับหลายหน้าจอคุณควรสร้างไอคอนแยกกันสำหรับความหนาแน่นของหน้าจอทั่วไปทั้งหมดรวมถึงหน้าจอที่มีความหนาแน่นต่ำปานกลางสูงและสูงเป็นพิเศษ เพื่อให้แน่ใจว่าไอคอนของคุณจะแสดงอย่างถูกต้องในอุปกรณ์ต่างๆที่สามารถติดตั้งแอปพลิเคชันของคุณได้

ดังนั้นวิธีที่ดีที่สุดในการเติมเต็มข้างต้นฉันใช้เครื่องมือสร้างการแจ้งเตือนที่จัดทำโดย Roman Nurik ในhttps://romannurik.github.io/AndroidAssetStudio/index.html

ด้วยวิธีนี้คุณสามารถใช้รูปภาพ (โดยคำนึงว่าสิ่งนี้จะต้องมีพื้นหลังโปร่งใส) และปล่อยให้เครื่องกำเนิดไฟฟ้าทำงานให้คุณสร้างไอคอนการแจ้งเตือนขนาดต่างๆ

สิ่งที่สำคัญที่สุดคือหากตัวสร้างไอคอนหลังจากที่คุณเรียกดูภาพที่คุณกำลังจะใช้แสดงวงกลมหรือสี่เหลี่ยมสีขาวแสดงว่ามีปัญหากับภาพของคุณอาจเป็นเพราะไม่มีแผ่นใสดังนั้นโปรดตรวจสอบให้แน่ใจว่า คุณมีสิ่งนี้โอเค


2
ในกรณีของฉันฉันมีเวกเตอร์ในdrawableโฟลเดอร์และ png ในdrawable-hdpi, xhdpiฯลฯ แต่มี PNG ไม่มีdrawable-mdpiและมันกระแทกบนอุปกรณ์ MDPI การโพสต์การแจ้งเตือน
Vadim Kotov

7

ในแอปของฉันข้อบกพร่องประเภทนี้เกิดขึ้นระหว่างการอัปเกรดเท่านั้น หากรหัสทรัพยากรเปลี่ยนแปลงในเวอร์ชันที่ใหม่กว่า Android RemoteViewอาจไม่พบทรัพยากรและทิ้งไฟล์RemoteServiceException. หากคุณเผยแพร่รุ่นที่ 3 และจะไม่เปลี่ยนรหัสทรัพยากรโรคจิตอาจหายไปเพียงชั่วคราว

เป็นไปได้ที่จะลดข้อบกพร่องประเภทนี้โดยการแก้ไขres/values/public.xmlและres/values/ids.xml. คอมไพเลอร์จะสร้าง ID ทรัพยากรบุคคลถ้า ID ทรัพยากรไม่ได้อยู่ในหรือpublic.xml ids.xmlเมื่อคุณเปลี่ยนชื่อทรัพยากรหรือเพิ่มทรัพยากรใหม่รหัสอาจเปลี่ยนไปและอุปกรณ์บางอย่างอาจค้นหาไม่พบ

ดังนั้นขั้นตอนดังต่อไปนี้:

  1. แยกไฟล์ apk และres/valuesค้นหาpublic.xmlและids.xml
  2. ค้นหาทรัพยากรทั้งหมดที่เกี่ยวข้องกับ RemoteView ในแอปของคุณและคัดลอก (สตริง, หรี่, วาดได้, เลย์เอาต์, รหัส, สี ... )
  3. สร้างpublic.xmlและids.xmlภายใต้res/valuesซอร์สโค้ดของคุณและวางบรรทัดที่คุณเพิ่งคัดลอก

บันทึก:

Gradle 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
ฉันได้ส่งภาพเวกเตอร์เป็นทรัพยากรแล้วและฉันคิดว่ามันทำให้เกิดปัญหาบนอุปกรณ์ oneplus / android 6 ไม่แน่ใจ 100%
Alexey

3

ในกรณีที่ไอคอนไม่สำคัญคุณสามารถแทนที่ได้

R.drawable.your_icon

ถึง

android.R.drawable.some_standard_icon

ได้ผล!


2

ฉันมี RemoteServiceException เมื่อใช้การแจ้งเตือนในชั้นเรียนของฉันขยายจาก FirebaseMessagingService ฉันเพิ่มรหัสต่อไปนี้ใน AndroidManifest.xml:

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

นอกจากนี้รีซอร์ส ic_small ที่ตั้งค่าในอินสแตนซ์ของคลาส Notification สร้างโดยเมธอด setSmallIcon (ไอคอน int)


ต้องเพิ่มข้อมูลเมตานี้ภายในแท็ก <service </service> หรือไม่
Andrey

2

ใน Android Studio เวอร์ชัน 3.0.0 ขึ้นไปเมื่อเพิ่มรูปภาพใหม่ในโฟลเดอร์ drawables ให้เลือก drawable แทน drawable-v24ใส่คำอธิบายภาพที่นี่

หากรูปภาพที่คุณกำลังใช้อยู่นั้น alread a (v24) เพียงแค่คัดลอกและวางในไดเร็กทอรีเดียวกัน (เช่น drawables) คราวนี้จะถามคุณว่าปกติหรือ v24 - ตรวจสอบให้แน่ใจว่าไม่ใช่ v24 แล้วลองอีกครั้งเพื่อแก้ไขข้อผิดพลาด


ข้อสังเกต - หากคุณอยู่ในมุมมอง "Android" ให้เปลี่ยนเป็นมุมมอง "โครงการ" ในมุมมอง Android คุณอาจไม่เห็นไดเร็กทอรี drawables
v24

2

ปัญหาเดียวกันเกิดขึ้นกับฉันเช่นกันและฉันได้แก้ไขปัญหาเดียวกันแล้ว

เหตุผล : สิ่งนี้เกิดขึ้นเนื่องจากเราใช้ vector drawable สำหรับ RemoteViews และ vector drawable สามารถวาดได้ในเวลาคอมไพล์ นอกจากนี้ฉันไม่แน่ใจว่าเหตุใดอุปกรณ์บางอย่างจึงไม่สามารถตรวจจับรหัสทรัพยากรที่ดึงได้ที่สร้างขึ้นในขณะที่เรากำลังอัปโหลดแอป แต่ใช่นี่คือเหตุผล

REPRODUCE ขั้นตอน 1. ติดตั้งบิลด์ก่อนหน้า 2. ส่งการแจ้งเตือน 3. อัปเดตบิลด์ด้วยรหัสเวอร์ชันถัดไป 4. หลังจากอัปเดตแอปแล้วอย่าเปิดแอปและส่งการแจ้งเตือนอีกครั้ง

วิธีแก้ไข แทนที่เวกเตอร์ที่วาดได้ด้วยไฟล์ (.png หรือ. jpg) ที่วาดได้ปกติ

ฉันหวังว่านี่จะช่วยแก้ปัญหาได้


1

หากคุณมีการแจ้งเตือนปรากฏขึ้นในขณะที่แอปของคุณอัปเดตคุณอาจพบปัญหานี้ สิ่งที่คุณอาจต้องทำคือสร้าง BroadcastReceiver ที่รอข้อความ 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
เหตุใดจึงควรช่วย
limitium

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

ฉันมี RemoteServiceException เมื่อใช้ android.support.constraint.ConstraintLayout เปลี่ยนเป็น LinearLayout หรือ Relative และ android: layout_height = "wrap_content" สำหรับคอนเทนเนอร์


0

(นี่ไม่ใช่วิธีแก้ปัญหาสำหรับคำถามปัจจุบัน แต่ช่วยคนที่มีปัญหาหลักที่คล้ายกัน) ฉันก็มีปัญหาเดียวกันเช่นกัน แต่ในกรณีของฉันฉันใช้ไฟล์. png ที่เสียหายซึ่งทำให้เกิดปัญหาเดียวกัน ดังนั้นฉันจึงลบมันและรวมไฟล์. png ที่ถูกต้องอีกครั้ง


0

โปรดแทนที่<android.support.v7.widget.AppCompatTextViewด้วย<TextViewจากรูปแบบการแจ้งเตือนที่กำหนดเอง

เนื่องจากandroid.support.v7.widget.AppCompatTextViewหรือandroid.support.v7.widget.AppCompatImageViewทำงานเฉพาะที่รันไทม์เท่านั้น

ดังนั้นใช้TextViewหรือImageView


0

หากมีใครยังคงประสบปัญหานี้: เพิ่มไฟล์ png ในโฟลเดอร์ที่วาดได้ของคุณด้วยชื่อ ic_stat_ic_notification (หรือชื่อใด ๆ ที่คุณต้องการ)

และในรายการของคุณเพิ่มด้านล่างสองสามบรรทัด

และคุณสามารถสร้างไอคอนของคุณได้ที่นี่ -> 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.Builder ได้โดยไม่มีปัญหา

    $msg_notificacion = [
                        'title'         => "titulonotif",
                       // "icon" : "myicon",
                        'body'          =>"cuerponotif"
                    ];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.