Cara memperbaikinya: android.app.RemoteServiceException: Notifikasi buruk diposting dari paket *: Tidak dapat membuat ikon: StatusBarIcon

127

Saya melihat pengecualian berikut di log kerusakan:

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)

Saya memposting Notifikasi dari IntentService dari pendingIntent yang diatur melalui AlarmManager menggunakan metode berikut. Semua nilai yang diteruskan di sini berasal dari paket bundel di 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());
}

Dari apa yang saya lihat dari jawaban lain - pengecualian yang saya lihat terjadi ketika setSmallIcon()tidak dipanggil dengan benar.

Saya telah memeriksa dan mengecek ulang bahwa ID Sumber Daya yang disahkan semuanya benar.

FishStix
sumber
3
Saya mengalami kesalahan yang sama (laporan kerusakan dari aplikasi langsung). Saya tidak dapat mereproduksi di perangkat saya. Saat ini saya berpikir itu karena orang memodifikasi .apk
darken
Guys, dengan cara apa saya bisa menyelesaikan masalah ini. Saya menggunakan pngs, tetapi sangat jarang crash aplikasi
user7856586

Jawaban:

98

Apa yang terjadi adalah, saya memasukkan referensi integer ke ikon dalam bundel PendingIntent, dan integer itu kemudian direferensikan saat diposting ke NotificationManager.

Di antara mendapatkan referensi bilangan bulat dan niat yang tertunda dimatikan, aplikasi diperbarui dan semua referensi yang dapat ditarik diubah. Integer yang digunakan untuk referensi drawable yang benar sekarang direferensikan drawable yang salah atau tidak sama sekali (tidak ada sama sekali - menyebabkan crash ini)

FishStix
sumber
8
Aneh. Dengan kata lain, ini tidak bisa diperbaiki bukan? Saya melihat crash yang sama di aplikasi saya.
Matthias
Sepertinya tidak bisa diperbaiki. Saya akan, di masa depan, harus memikirkan cara lain untuk memposting pemberitahuan dengan gambar di masa depan ....
FishStix
Bagaimana jika kita mencoba mengatur textSize dari remote view sebagai ret.setInt (id, "setTextSize", 20); Itu juga crash. Saya tahu kami juga harus menyediakan unit, tetapi bagaimana saya melakukannya dengan metode tanda tangan seperti itu. Pointer apa saja ??
bitsabhi
1
Mungkinkah menghapus pemberitahuan dan segala sesuatu yang terkait saat aplikasi mati untuk diperbarui? (Dengan asumsi itu akan membuat aplikasi menghindari masalah)
NoHarmDan
3
Jika Anda ingin mereferensikan R.drawable.my_image, lebih aman menyimpannya ke bundel sebagai string ( bundle.putString("img", "my_image")dan kemudian mengonversi ketika diperlukan ke integer @DrawableRes aktual sebagai berikut:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
vanomart
52

Penggunaan VectorXmldi dalam pemberitahuan Anda telah diketahui menyebabkan masalah ini. Gunakan png

Bubunyo Nyavor
sumber
4
Hanya PNG yang digunakan.
FishStix
Dalam kasus saya, saya punya vektor di drawablefolder dan png di drawable-hdpi, xhdpi, dll Tapi tidak ada png untuk drawable-mdpi, dan itu jatuh pada perangkat MDPI pada postingan pemberitahuan.
Vadim Kotov
34

Jangan gunakan SVG di Kitkat!

Saya memiliki masalah yang sama setiap kali saya ingin menunjukkan pemberitahuan pada Kitkat. Apa yang menyebabkan masalah bagi saya adalah bahwa saya telah mendefinisikan setiap ikon di xml (dari svg), ikon kecil dan ikon tindakan juga. Setelah saya menggantinya dengan png-s masalah diselesaikan di sisi saya.

bendaf
sumber
4
Saya bisa konfirmasi. Gambar yang dapat digambar dalam pemberitahuan menyebabkan RemoteServiceException di KitKat.
Khizhny Andrey
2
Dalam kasus KitKat, masalah teratasi ketika saya mengganti XML dengan PNG di: NotificationCompat.Builder baru (konteks, CHANNEL_ID) .setSmallIcon (R.drawable.my_icon)
Andrew Glukhoff
1
Ini berhasil untuk saya. Saya menjalankan API 19 dan menggunakan file SVG untuk ikon pemberitahuan dan memberi saya kesalahan ini, sampai saya beralih ke ikon png kecil
WHOATEMYNOODLES
10

android.app.RemoteServiceException: Notifikasi buruk diposkan

Saya memiliki masalah yang sama, tetapi saya terselesaikan. Masalah saya adalah ".xml file" dari Remote view.

Dalam file xml saya, saya menambahkan satu Viewdi antara LinearLayoutpembagi untuk.

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

ViewKomponen di atas membuat pengecualian pemberitahuan Buruk. Alasan Pengecualian ini hanya file xml dari Remoteviews.

Setelah menghapus komponen Lihat itu, Kode saya dijalankan dengan benar, tanpa kecuali. Jadi saya merasa bahwa laci Pemberitahuan tidak menerima tampilan khusus.

Jadi Anda tidak menggambar apa pun seperti tampilan di atas dalam file RemoteViewobjek .xml .

Kona Suresh
sumber
9

Masalah saya adalah ikon yang saya gunakan

.setSmallIcon(R.drawable.ic_stat_push_notif)

tidak dihasilkan sesuai. Menurut dokumen resmi :

Seperti yang dijelaskan dalam Menyediakan Set Ikon Khusus Kepadatan dan Mendukung Beberapa Layar, Anda harus membuat ikon terpisah untuk semua kepadatan layar umum, termasuk layar dengan kepadatan rendah, sedang, tinggi, dan ekstra-tinggi. Ini memastikan bahwa ikon Anda akan ditampilkan dengan baik di berbagai perangkat tempat aplikasi Anda dapat diinstal.

Jadi cara terbaik untuk memenuhi hal di atas, saya menggunakan Notification Generator yang disediakan oleh Roman Nurik di https://romannurik.github.io/AndroidAssetStudio/index.html

Dengan cara itu, Anda dapat menggunakan gambar (dengan pertimbangan bahwa ini harus memiliki latar belakang transparan) dan biarkan generator melakukan pekerjaan untuk Anda menghasilkan ukuran yang berbeda untuk ikon pemberitahuan.

Yang paling penting adalah jika ikon generator setelah Anda menelusuri gambar yang akan Anda gunakan menunjukkan kepada Anda lingkaran atau kotak berwarna putih, ada masalah dengan gambar Anda, mungkin karena tidak memiliki transparansi, jadi pastikan bahwa kamu punya ini ok.

Carlos Daniel
sumber
2
Dalam kasus saya, saya punya vektor di drawablefolder dan png di drawable-hdpi, xhdpi, dll Tapi tidak ada png untuk drawable-mdpi, dan itu jatuh pada perangkat MDPI pada postingan pemberitahuan.
Vadim Kotov
7

Di aplikasi saya, bug semacam ini hanya terjadi selama peningkatan. Jika id sumber daya berubah dalam versi yang lebih baru, Android RemoteViewmungkin gagal menemukan sumber daya dan membuang RemoteServiceException. Jika Anda menerbitkan versi ke-3 dan tidak mengubah id sumber daya, bug hanya dapat hilang untuk sementara waktu .

Dimungkinkan untuk mengurangi bug semacam ini dengan mengedit res/values/public.xmldan res/values/ids.xml. Compiler akan menghasilkan id sumber daya individual jika id sumber daya tidak dalam public.xmlatauids.xml . Ketika Anda mengubah nama sumber daya atau menambahkan beberapa sumber daya baru, id dapat berubah dan beberapa perangkat mungkin gagal menemukannya.

Jadi langkahnya adalah sebagai berikut:

  1. Dekompilasi file apk dan res/valuescari public.xmldanids.xml
  2. Temukan semua sumber daya yang terkait dengan RemoteView di aplikasi Anda dan salin (string, dimen, drawable, layout, id, color ...)
  3. Buat public.xmldan di ids.xmlbawah res/valuesdalam kode sumber Anda dan tempelkan baris yang baru saja Anda salin

catatan:

Gradle 1.3.0 dan di atas mengabaikan lokal public.xml. Untuk membuatnya berfungsi, Anda perlu menambahkan beberapa skrip dibuild.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)
            }
        }
    }
}

Catatan: Skrip ini tidak mendukung proyek submodul. Saya mencoba memperbaikinya.

petir
sumber
3

Anda telah melewati ikon yang sama

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

dan Anda pemberitahuan

 NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this, channelId)
                        .setSmallIcon(R.drawable.ic_stat_name)
                        .setContentTitle("Title")
                        .setContentText(messageBody)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);
Tarun Umath
sumber
2
Saya telah melewati gambar vektor sebagai sumber daya dan saya pikir itu menyebabkan crash pada perangkat oneplus / android 6. Tidak yakin untuk 100%.
Alexey
3

Kalau-kalau ikon tidak penting, Anda dapat mengganti,

R.drawable.your_icon

Untuk

android.R.drawable.some_standard_icon

Ini bekerja!

Ashwin Balani
sumber
2

Saya memiliki RemoteServiceException ketika menggunakan Notifikasi di kelas saya meluas dari FirebaseMessagingService. Saya menambahkan kode berikut ke AndroidManifest.xml:

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

Juga ic_small sumber diatur dalam contoh Notification.Builder kelas dengan metode setSmallIcon (ikon int).

Вячеслав Бондаренко
sumber
metadata ini harus ditambahkan di dalam tag <service </service>?
Andrey
2

Di Android Studio versi 3.0.0 dan di atasnya, saat menambahkan gambar baru di folder drawables pilih drawable bukan drawable-v24.masukkan deskripsi gambar di sini

Jika gambar, yang Anda gunakan, adalah alread (v24) cukup salin dan tempel di direktori yang sama (mis. Drawables). Kali ini ia akan menanyakan Anda yang biasa atau v24 - pastikan saja bukan v24 dan coba lagi ini akan memperbaiki kesalahan.

Haider Malik
sumber
Perhatikan - jika Anda berada di tampilan "Android", alihkan ke tampilan "Project". Dalam tampilan Android, Anda mungkin tidak melihat direktori
drawables v24
2

Masalah yang sama terjadi dengan saya juga dan saya telah menyelesaikannya

ALASAN : Ini terjadi karena kami menggunakan drawable vektor untuk RemoteViews dan drawable vector menghasilkan drawable pada waktu kompilasi. Saya juga tidak yakin mengapa beberapa perangkat tidak dapat mendeteksi id sumber daya yang dapat dibuat yang dihasilkan saat kami meningkatkan aplikasi. Tapi ya inilah alasannya.

REPRODUSI Langkah 1. Instal bangunan sebelumnya. 2. Kirim pemberitahuan 3. Perbarui build dengan kode versi berikutnya 4. Setelah memperbarui aplikasi jangan membuka aplikasi dan mengirim pemberitahuan lagi

SOLUSI Ganti gambar yang dapat digambar dengan file drawable (.png or .jpg) yang normal.

Saya harap ini menyelesaikan masalah.

Gajju
sumber
1

Jika Anda memiliki pemberitahuan yang terlihat saat aplikasi Anda diperbarui, Anda mungkin mengalami ini. Yang perlu Anda lakukan adalah membuat BroadcastReceiver yang menunggu pesan PACKAGE_CHANGED, di mana Anda mematikan semua layanan yang juga akan mengabaikan pemberitahuan terkait.

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

Saya memiliki masalah yang sama ketika saya mengatur notifikasi dalam satu bundel. Saya mencoba ini dan itu memecahkan masalah saya:

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

Pastikan setLargeIcon () dipanggil sebelum setSmallIcon ().

Jeli
sumber
4
Mengapa ini membantu?
limitium
0

Saya juga punya masalah yang sama. Masalahnya adalah dengan ikon yang Anda gunakan, saya menggunakan android.R.drawable.stat_sys_download. Buka drawables.xml dan rekatkan ini.

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

dan kemudian dalam kode Anda

builder.setSmallIcon(R.drawable.ic_start_download);

Anda dapat mencoba beberapa gambar lain sebagai ganti gambar ini

karthik vishnu kumar
sumber
0

Cara saya mengatasi ini: Saya memiliki tampilan "buruk" dalam tata letak saya (mis: kotak centang) - jadi saya menghapusnya.

RemoteViews tampaknya hanya mendukung gambar dan teks (harus dikonfirmasi dengan membaca dokumen).

Benjamin Piette
sumber
0

Saya memiliki RemoteServiceException ketika menggunakan android.support.constraint.ConstraintLayout. Ubah ke LinearLayout atau Relatif dan juga android: layout_height = "wrap_content" untuk wadah

JustAndrew
sumber
0

(ini bukan solusi untuk pertanyaan saat ini tetapi membantu seseorang dengan masalah inti yang sama) Saya juga memiliki masalah yang sama, Tetapi dalam kasus saya saya telah menggunakan file .png rusak yang menyebabkan masalah yang sama. Jadi saya telah menghapusnya dan memasukkan kembali file .png yang benar.

RameshJanagama
sumber
0

Silakan ganti <android.support.v7.widget.AppCompatTextViewdengan <TextViewdari tata letak pemberitahuan khusus.

Karena android.support.v7.widget.AppCompatTextViewatau android.support.v7.widget.AppCompatImageViewhanya berfungsi saat runtime.

Jadi, Gunakan TextViewatauImageView

Ahamadullah Saikat
sumber
0

Jika ada yang masih menghadapi masalah ini: Tambahkan file png di folder yang dapat digambar dengan nama ic_stat_ic_notification (atau nama apa pun yang Anda suka)

dan di manifes Anda tambahkan beberapa baris di bawah ini

dan Anda dapat membuat ikon Anda di sini -> https://romannurik.github.io/AndroidAssetStudio/icon

Jayapen Jose
sumber
0

Sinkronisasi proyek dan daripada Bersihkan, File> Sinkronkan kemudian: Bangun> Bersihkan Proyek

Saya harap itu akan membantu Anda semua, Ini bekerja untuk saya

napster asli
sumber
0

Saya mendapatkan kesalahan ini karena tautan otomatis dan opsi-opsi yang dapat diklik di tampilan teks dalam tampilan pemberitahuan:

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

Hati-hati!

Menguasai
sumber
-3

Ini berhasil untuk saya. Komentari referensi ikon dan dengan demikian dapat menggunakan NotificationCompat.Builder tanpa masalah.

    $msg_notificacion = [
                        'title'         => "titulonotif",
                       // "icon" : "myicon",
                        'body'          =>"cuerponotif"
                    ];
Alfonso Gutiérrez
sumber