Cách khắc phục: android.app.RemoteServiceException: Thông báo xấu được đăng từ gói *: Không thể tạo biểu tượng: StatusBarIcon


127

Tôi đang thấy ngoại lệ sau trong nhật ký sự cố:

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)

Tôi đang đăng Thông báo của mình từ IntentService từ bộ PendingIntent thông qua Trình quản lý báo thức bằng phương pháp sau. Tất cả các giá trị được truyền vào đây là từ các gói bổ sung trong 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());
}

Từ những gì tôi đã thấy về các câu trả lời khác - ngoại lệ tôi thấy xảy ra khi setSmallIcon()không được gọi đúng.

Tôi đã kiểm tra và kiểm tra lại rằng các ID tài nguyên được thông qua đều đúng.


3
Tôi đang gặp lỗi tương tự (báo cáo sự cố từ một ứng dụng trực tiếp). Tôi không thể sao chép nó trên thiết bị của mình. Tôi hiện đang nghĩ rằng vì mọi người đã sửa đổi .apk
làm tối

Các bạn, theo cách nào tôi có thể giải quyết vấn đề này. Tôi sử dụng pngs, nhưng rất hiếm khi ứng dụng gặp sự cố
user7856586 27/2/18

Câu trả lời:


98

Điều đang xảy ra là, tôi đã bao gồm tham chiếu số nguyên cho biểu tượng trong gói PendingIntent và số nguyên đó sau đó đã được tham chiếu trong khi được đăng lên Thông báo.

Ở giữa việc lấy tham chiếu số nguyên và ý định chờ xử lý sẽ tắt, ứng dụng đã được cập nhật và tất cả các tham chiếu có thể rút ra đã thay đổi. Số nguyên được sử dụng để tham chiếu drawable chính xác bây giờ tham chiếu cả drawable không chính xác hoặc không có gì cả (không có gì cả - gây ra sự cố này)


8
Kỳ quái. Nói cách khác, điều này không thể sửa được phải không? Tôi đang thấy các sự cố tương tự trong ứng dụng của tôi.
Matthias

Nó dường như không thể sửa chữa. Trong tương lai, tôi sẽ phải nghĩ ra một cách khác để đăng thông báo bằng hình ảnh trong tương lai ....
FishStix

Điều gì xảy ra nếu chúng ta cố gắng đặt textSize của chế độ xem từ xa là ret.setInt (id, "setTextSize", 20); Nó cũng gặp sự cố. Tôi biết chúng tôi cũng phải cung cấp cho các đơn vị, nhưng làm thế nào để tôi làm điều đó với chữ ký phương thức như vậy. Con trỏ nào ??
bitsabhi

1
Có thể xóa thông báo và mọi thứ liên quan khi ứng dụng bị hủy để cập nhật không? (Giả sử điều đó sẽ khiến ứng dụng tránh được sự cố)
NoHarmDan

3
Trong trường hợp bạn muốn tham chiếu R.drawable.my_image, an toàn hơn là lưu nó thành một chuỗi ( bundle.putString("img", "my_image")và sau đó chuyển đổi khi cần thành số nguyên @DrawableRes thực tế như sau:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
vanomart

52

Sử dụng VectorXmlbên trong thông báo của bạn đã được biết là gây ra vấn đề này. Sử dụng png


4
Chỉ có PNG được sử dụng.
FishStix

Trong trường hợp của tôi, tôi đã có vector trong drawablethư mục và png trong drawable-hdpi, xhdpi, vv Tuy nhiên, không có png cho drawable-mdpi, và nó đã bị rơi trên thiết bị mdpi để đăng thông báo.
Vadim Kotov

34

Đừng sử dụng SVG trên Kitkat!

Tôi gặp vấn đề tương tự mỗi lần khi tôi muốn hiển thị thông báo trên Kitkat. Điều gây ra vấn đề cho tôi là tôi đã xác định mọi biểu tượng trong xml (từ svg), biểu tượng nhỏ và biểu tượng hành động cũng có. Sau khi tôi thay thế chúng bằng png-s, vấn đề được giải quyết ở phía tôi.


4
Tôi có thể xác nhận. Vector drawables trong thông báo gây ra RemoteServiceException trên KitKat.
Khizhny Andrey

2
Trong trường hợp của KitKat, vấn đề đã được giải quyết khi tôi thay thế XML bằng PNG trong: NotificationCompat.Builder (bối cảnh, CHANNEL_ID) .setSmallIcon (R.drawable.my_icon)
Andrew Glukhoff

1
Điều này làm việc cho tôi. Tôi đang chạy API 19 và sử dụng tệp SVG cho biểu tượng thông báo và đã báo lỗi cho tôi, cho đến khi tôi chuyển nó thành biểu tượng png nhỏ
WHOATEMYNOODLES

10

android.app.RemoteServiceException: Thông báo xấu được đăng

Tôi đã có cùng một vấn đề, nhưng tôi đã được giải quyết. Vấn đề của tôi là "tập tin .xml" của Chế độ xem từ xa.

Trong tệp xml của tôi, tôi đã được thêm một Viewở giữa LinearLayoutdải phân cách.

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

Các Viewthành phần trên tạo ra ngoại lệ thông báo xấu. Lý do ngoại lệ này chỉ là tệp xml của Remoteview.

Sau khi xóa thành phần View đó, mã của tôi được thực thi đúng, không có ngoại lệ. Vì vậy, tôi cảm thấy rằng ngăn kéo Thông báo không chấp nhận bất kỳ chế độ xem tùy chỉnh.

Vì vậy, bạn không vẽ bất kỳ thứ gì như chế độ xem ở trên trong tệp .xml của RemoteViewđối tượng.


9

Vấn đề của tôi là biểu tượng tôi đang sử dụng

.setSmallIcon(R.drawable.ic_stat_push_notif)

không được tạo ra tương ứng. Theo tài liệu chính thức :

Như được mô tả trong Cung cấp các bộ biểu tượng cụ thể về mật độ và hỗ trợ nhiều màn hình, bạn nên tạo các biểu tượng riêng cho tất cả các mật độ màn hình tổng quát, bao gồm các màn hình mật độ thấp, trung bình, cao và cực cao. Điều này đảm bảo rằng các biểu tượng của bạn sẽ hiển thị chính xác trên phạm vi các thiết bị mà ứng dụng của bạn có thể được cài đặt.

Vì vậy, cách tốt nhất để hoàn thành phần trên, tôi đã sử dụng Trình tạo thông báo do Roman Nurik cung cấp trên https://romannurik.github.io/AndroidAssetStudio/index.html

Theo cách đó, bạn có thể sử dụng một hình ảnh (xem xét rằng điều này phải có nền trong suốt) và để trình tạo thực hiện công việc cho bạn tạo các kích thước khác nhau cho các biểu tượng thông báo.

Điều quan trọng nhất là nếu trình tạo biểu tượng sau khi bạn duyệt hình ảnh bạn sẽ sử dụng sẽ hiển thị cho bạn một hình tròn hoặc hình vuông đầy màu trắng, có vấn đề với hình ảnh của bạn, có thể vì nó không có độ trong suốt, vì vậy hãy chắc chắn rằng bạn có cái này ok


2
Trong trường hợp của tôi, tôi đã có vector trong drawablethư mục và png trong drawable-hdpi, xhdpi, vv Tuy nhiên, không có png cho drawable-mdpi, và nó đã bị rơi trên thiết bị mdpi để đăng thông báo.
Vadim Kotov

7

Trong ứng dụng của tôi, loại lỗi này chỉ xảy ra trong quá trình nâng cấp. Nếu id tài nguyên thay đổi trong phiên bản mới hơn, Android RemoteViewcó thể không tìm thấy tài nguyên và loại bỏ RemoteServiceException. Nếu bạn xuất bản phiên bản thứ 3 và không thay đổi id tài nguyên, các lỗi chỉ có thể biến mất tạm thời .

Có thể giảm loại lỗi này bằng cách chỉnh sửa res/values/public.xmlres/values/ids.xml. Trình biên dịch sẽ tạo một id tài nguyên riêng lẻ nếu id tài nguyên không ở trong public.xmlhoặc ids.xml. Khi bạn thay đổi tên tài nguyên hoặc thêm một số tài nguyên mới, id có thể thay đổi và một số thiết bị có thể không tìm thấy nó.

Vì vậy, bước như sau:

  1. Biên dịch tệp apk và res/valuestìm public.xmlids.xml
  2. Tìm tất cả các tài nguyên liên quan đến RemoteView trong ứng dụng của bạn và sao chép chúng (chuỗi, làm mờ, có thể vẽ, bố cục, id, màu ...)
  3. Tạo public.xmlids.xmldưới res/valuesmã nguồn của bạn và dán các dòng bạn vừa sao chép

Ghi chú:

Lớp 1.3.0 trở lên bỏ qua địa phương public.xml. Để làm cho nó hoạt động, bạn cần thêm một số tập lệnh trongbuild.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)
            }
        }
    }
}

Lưu ý: Kịch bản này không hỗ trợ dự án mô đun con. Tôi đang cố gắng sửa nó.


3

Bạn đã vượt qua cùng một biểu tượng

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

và bạn thông báo

 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
Tôi đã chuyển hình ảnh vector dưới dạng tài nguyên và tôi nghĩ rằng nó đã gây ra sự cố trên các thiết bị oneplus / android 6. Không chắc chắn 100%.
Alexey

3

Chỉ trong trường hợp biểu tượng không quan trọng, bạn có thể thay thế,

R.drawable.your_icon

Đến

android.R.drawable.some_standard_icon

Những công việc này!


2

Tôi đã có RemoteServiceException khi sử dụng Thông báo trong lớp của tôi mở rộng từ FirebaseMessagingService. Tôi đã thêm đoạn mã sau vào AndroidManifest.xml:

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

Ngoài ra tài nguyên ic_small được thiết lập trong trường hợp của Thông báo lớp.Builder theo phương thức setSmallIcon (biểu tượng int).


siêu dữ liệu này có phải được thêm vào bên trong thẻ <service </ service> không?
Andrey

2

Trong Android Studio phiên bản 3.0.0 trở lên, khi thêm hình ảnh mới vào thư mục drawables, hãy chọn drawable thay vì drawable-v24.nhập mô tả hình ảnh ở đây

Nếu hình ảnh, bạn đang sử dụng, đã đọc (v24), chỉ cần sao chép nó và dán nó vào cùng thư mục của nó (ví dụ: drawables). Lần này nó sẽ hỏi bạn thường xuyên hay v24 - chỉ cần đảm bảo rằng nó không phải là v24 và thử lại, điều này sẽ khắc phục lỗi.


Lưu ý - nếu bạn đang ở chế độ xem "Android", hãy chuyển nó sang chế độ xem "Dự án". Trong chế độ xem Android, bạn có thể không thấy thư mục v24 drawables
Hatzil

2

Vấn đề tương tự cũng xảy ra với tôi và tôi đã giải quyết tương tự

LÝ DO : Điều này xảy ra do chúng tôi đang sử dụng vector drawable cho RemoteViews và vector drawable tạo drawable tại thời gian biên dịch. Ngoài ra, tôi không chắc tại sao một số thiết bị không thể phát hiện id tài nguyên có thể vẽ được trong khi chúng tôi đang nâng cấp ứng dụng. Nhưng vâng, đây là lý do.

REPRODUCE Các bước 1. Cài đặt bản dựng trước. 2. Gửi thông báo 3. Cập nhật bản dựng với mã phiên bản tiếp theo 4. Sau khi cập nhật ứng dụng, đừng mở ứng dụng và gửi lại thông báo

GIẢI PHÁP Thay thế vector có thể vẽ bằng tệp drawable (.png hoặc .jpg) thông thường.

Tôi hy vọng điều này giải quyết vấn đề.


1

Nếu bạn có thông báo hiển thị trong khi ứng dụng của bạn được cập nhật, bạn có thể gặp phải thông báo này. Những gì bạn có thể cần làm là tạo một BroadcastReceiver chờ tin nhắn PACKAGE_CHANGED, tại thời điểm đó bạn tắt tất cả các dịch vụ cũng sẽ loại bỏ các thông báo liên quan của chúng.

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

0

Tôi gặp vấn đề tương tự khi tôi đặt một thông báo trong một gói. Tôi đã thử điều này và nó đã giải quyết vấn đề của tôi:

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

Hãy chắc chắn rằng setLargeIcon () được gọi trước khi setSmallIcon ().


4
Tại sao điều này nên giúp đỡ?
hạn

0

Tôi cũng có vấn đề tương tự. Vấn đề là với biểu tượng mà bạn đang sử dụng, tôi đã sử dụng android.R.drawable.stat_sys_doad. Truy cập drawables.xml và dán tệp này.

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

và sau đó trong mã của bạn

builder.setSmallIcon(R.drawable.ic_start_download);

Bạn có thể thử một số hình ảnh khác thay vì hình ảnh này


0

Cách của tôi để giải quyết vấn đề này: Tôi có các chế độ xem "xấu" trong bố cục của mình (ví dụ: hộp kiểm) - vì vậy tôi đã xóa chúng.

RemoteViews dường như chỉ hỗ trợ hình ảnh và văn bản (được xác nhận bằng cách đọc tài liệu).


0

Tôi đã có RemoteServiceException khi sử dụng android.support.constraint.ConstraintLayout. Thay đổi nó thành linearLayout hoặc Relative và cả android: layout_height = "quấn_content" cho container


0

(đây không phải là giải pháp cho câu hỏi hiện tại nhưng giúp người nào đó có vấn đề cốt lõi tương tự) Tôi cũng gặp vấn đề tương tự, nhưng trong trường hợp của tôi, tôi đã sử dụng tệp .png bị hỏng gây ra vấn đề tương tự. Vì vậy, tôi đã xóa nó và bao gồm lại tập tin .png chính xác.


0

Vui lòng thay thế <android.support.v7.widget.AppCompatTextViewbằng <TextViewtừ bố trí thông báo tùy chỉnh.

Bởi vì android.support.v7.widget.AppCompatTextViewhoặc android.support.v7.widget.AppCompatImageViewchỉ hoạt động trong thời gian chạy.

Vì vậy, sử dụng TextViewhoặcImageView


0

Nếu bất kỳ ai vẫn gặp phải vấn đề này: Thêm tệp png trong thư mục có thể vẽ của bạn với tên ic_stat_ic_notification (hoặc bất kỳ tên nào bạn thích)

và trong bảng kê khai của bạn thêm bên dưới vài dòng

và bạn có thể tạo biểu tượng của mình tại đây -> https://romannurik.github.io/AndroidAssetStudio/icon


0

Đồng bộ hóa dự án và hơn Làm sạch nó, Tệp> Đồng bộ hóa sau đó: Xây dựng> Dự án sạch

Tôi hy vọng điều đó sẽ giúp tất cả các bạn, Nó làm việc cho tôi


0

Tôi đã gặp lỗi này do autolink và links Tùy chọn có thể nhấp trong textview trong chế độ xem thông báo:

<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" />

Hãy cẩn thận!


-3

Điều này làm việc cho tôi. Nhận xét tham chiếu của biểu tượng và do đó có thể sử dụng NotificationCompat.Builder mà không gặp vấn đề gì.

    $msg_notificacion = [
                        'title'         => "titulonotif",
                       // "icon" : "myicon",
                        'body'          =>"cuerponotif"
                    ];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.