Nasıl düzeltilir? Android.app.RemoteServiceException: Paketten gönderilen hatalı bildirim *: Simge oluşturulamadı: StatusBarIcon


128

Kilitlenme günlüklerinde aşağıdaki istisnayı görüyorum:

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)

Aşağıdaki yöntemi kullanarak AlarmManager aracılığıyla bir PendingIntent kümesinden bir IntentService gelen Bildirimimi gönderiyorum. Burada iletilen tüm değerler, PendingIntent / IntentService içindeki paket ekstralarındandır.

/**
 * 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());
}

Diğer cevaplardan gördüğüm kadarıyla - gördüğüm istisna setSmallIcon(), düzgün çağrılmadığında oluyor .

Aktarılan Kaynak Kimliklerinin tümünün doğru olup olmadığını kontrol ettim ve iki kez kontrol ettim.


3
Aynı hatayı yaşıyorum (canlı bir uygulamadan kilitlenme raporları). Cihazımda yeniden üretemiyorum. Şu anda insanlar .apk modifiye yüzünden olduğunu düşünüyorum
karartmak

Beyler, bu sorunu hangi şekilde çözebilirim?
Ping

Yanıtlar:


98

Olan şey şuydu, PendingIntent paketindeki simgeye tamsayı referansını ekliyordum ve bu tam sayı daha sonra NotificationManager'a gönderilirken başvuruluyordu.

Tamsayı referansını alma ile bekleyen niyetin iptali arasında, uygulama güncellendi ve tüm çekilebilir referanslar değiştirildi. Doğru çekilebilirliğe atıfta bulunmak için kullanılan tamsayı artık ya yanlış çekilebilirliğe ya da hiçbirine başvurmuyordu (hiç yok - bu çökmeye neden oluyor)


8
Tuhaf. Başka bir deyişle, bu düzeltilebilir değil, değil mi? Uygulamamda aynı kilitlenmeleri görüyorum.
Matthias

Düzeltilebilir görünmüyor. Gelecekte, gelecekte resimlerle bildirim yayınlamak için farklı bir yol
bulmalıyım

Uzak görüntünün textSize değerini ret.setInt (id, "setTextSize", 20) olarak ayarlamaya çalışırsak ne olur; Aynı zamanda çöküyor. Ayrıca birimleri sağlamamız gerektiğini de biliyorum, ancak bunu böyle bir yöntem imzasıyla nasıl yaparım. Herhangi bir işaretçi?
bitsabhi

1
Uygulama sonlandırıldığında bildirimi ve ilgili her şeyi güncellemek için temizlemek mümkün olabilir mi? (Uygulamanın sorundan kaçınmasını sağlayacağını varsayarsak)
NoHarmDan

3
R.drawable.my_image'e başvurmak istemeniz durumunda, onu bir dize olarak paketlemek için kaydetmek daha güvenlidir ( bundle.putString("img", "my_image")ve daha sonra gerektiğinde aşağıdaki gibi gerçek @DrawableRes tamsayıya dönüştürün:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
vanomart

52

VectorXmlBildiriminizin içinde kullanmanın bu soruna neden olduğu bilinmektedir. Png kullan


4
Yalnızca PNG'ler kullanılıyordu.
FishStix

Benim durumumda, ben de vektör vardı drawableklasörü ve png en içinde drawable-hdpi, xhdpivb Ama hiçbir png yoktu drawable-mdpive bir bildirim yayınlayarak üzerinde MDPI cihazda çöktü.
Vadim Kotov

34

Kitkat'ta SVG kullanmayın!

Kitkat'ta bir bildirim göstermek istediğimde her seferinde aynı sorunu yaşadım. Benim için soruna neden olan şey, xml'deki (svg'den) her simgeyi, küçük simgeyi ve eylem simgesini de tanımlamış olmam. Bunları png-ler ile değiştirdikten sonra sorun benim tarafımda çözüldü.


4
Onaylayabilirim. Bildirimlerdeki vektör çekilebilir öğeleri KitKat'ta RemoteServiceException'a neden olur.
Khizhny Andrey

2
KitKat durumunda, XML'yi PNG ile değiştirdiğimde sorun çözüldü: new NotificationCompat.Builder (bağlam, CHANNEL_ID) .setSmallIcon (R.drawable.my_icon)
Andrew Glukhoff

1
Bu benim için çalıştı. API 19'u çalıştırıyordum ve bildirim simgesi için bir SVG dosyası kullandım ve küçük bir png simgesine dönüştürene kadar bana bu hatayı veriyordum
WHOATEMYNOODLES

10

android.app.RemoteServiceException: Hatalı bildirim yayınlandı

Ben de aynı sorunu yaşadım ama çözüldüm. Benim sorunum Uzak görünümün ".xml dosyası".

Xml dosyamda for bölücünün Viewarasına bir tane ekledim LinearLayout.

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

ViewKötü bildirim istisnasını oluşturan yukarıdaki bileşen. Bu İstisna nedeni yalnızca Remoteviews xml dosyasıdır.

Bu View bileşenini kaldırdıktan sonra, Kodum istisnasız düzgün bir şekilde çalıştı. Bu yüzden Bildirim çekmecesinin herhangi bir özelleştirilmiş görünümü kabul etmediğini hissettim.

Yani RemoteViewnesnenin .xml dosyasında yukarıdaki görünüm gibi bir şey çizmezsiniz .


9

Benim sorunum, kullandığım simgenin

.setSmallIcon(R.drawable.ic_stat_push_notif)

buna göre oluşturulmadı. Göre resmi doc :

Yoğunluğa Özgü Simge Setleri Sağlama ve Birden Çok Ekranı Destekleme bölümünde açıklandığı gibi, düşük, orta, yüksek ve ekstra yüksek yoğunluklu ekranlar dahil tüm genelleştirilmiş ekran yoğunlukları için ayrı simgeler oluşturmalısınız. Bu, simgelerinizin uygulamanızın yüklenebileceği çeşitli cihazlarda düzgün görüntülenmesini sağlar.

Yukarıdakileri doldurmanın en iyi yolu, Roman Nurik tarafından https://romannurik.github.io/AndroidAssetStudio/index.html adresinde sağlanan Notification Generator'ı kullandım.

Bu şekilde, bir görüntü kullanabilir (bunun şeffaf bir arka plana sahip olması gerektiğini dikkate alarak) ve bildirim simgeleri için farklı boyutlar oluşturarak jeneratörün işi sizin için yapmasına izin verebilirsiniz.

En önemli şey, kullanacağınız görüntüye göz attıktan sonra simge oluşturucu size beyaz dolu bir daire veya kare gösteriyorsa, görüntünüzle ilgili sorunlar olabilir, belki de saydam olmadığı için, bu yüzden emin olun bu tamam.


2
Benim durumumda, ben de vektör vardı drawableklasörü ve png en içinde drawable-hdpi, xhdpivb Ama hiçbir png yoktu drawable-mdpive bir bildirim yayınlayarak üzerinde MDPI cihazda çöktü.
Vadim Kotov

7

Uygulamamda bu tür bir hata yalnızca yükseltme sırasında oluyor. Yeni sürümde kaynak kimliği değişirse, Android RemoteViewkaynağı bulamayabilir ve RemoteServiceException. 3. bir sürüm yayınlarsanız ve kaynak kimliğini değiştirmezseniz, hatalar yalnızca geçici olarak kaybolabilir .

Bu tür hataları düzenleyerek azaltmak mümkündür res/values/public.xmlve res/values/ids.xml. Derleyici, kaynak kimliği public.xmlveya içinde değilse bireysel bir kaynak kimliği oluşturacaktır ids.xml. Kaynak adını değiştirdiğinizde veya yeni kaynaklar eklediğinizde, kimlik değişebilir ve bazı cihazlar onu bulamayabilir.

Yani adım şu şekildedir:

  1. Apk dosyasını decompile ve res/valuesbulmak public.xmlveids.xml
  2. Uygulamanızda RemoteView ile ilgili tüm kaynakları bulun ve kopyalayın (dizeler, dimen, çekilebilir, düzen, kimlik, renk ...)
  3. Kaynak kodunuzda oluşturun public.xmlve ids.xmlaltına res/valueskopyalayın ve kopyaladığınız satırları yapıştırın

Not:

Gradle 1.3.0 ve üstü yerel olanı görmezden gelir public.xml. Çalışması için, dosyanıza bir komut dosyası eklemeniz gerekir.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)
            }
        }
    }
}

Not: Bu komut dosyası alt modüller projesini desteklemez. Düzeltmeye çalışıyorum.


3

Aynı simgeyi geçtiniz

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

ve sen bildirim

 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
Vektör görüntüsünü kaynak olarak geçtim ve bence oneplus / android 6 cihazlarda çökmelere neden oldu. % 100 emin değilim.
Alexey

3

Simgenin önemli olmaması durumunda, değiştirebilirsiniz,

R.drawable.your_icon

için

android.R.drawable.some_standard_icon

Bu çalışıyor!


2

Sınıfımda Notification kullanımı FirebaseMessagingService'den genişlediğinde RemoteServiceException yaşadım. Aşağıdaki kodu AndroidManifest.xml'e ekledim:

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

Ayrıca , setSmallIcon (int icon) yöntemine göre Notification.Builder sınıfının örneğinde bulunan ic_small kaynağı.


bu meta verilerin <service </service> etiketlerinin içine eklenmesi gerekir mi?
Andrey

2

Android Studio 3.0.0 ve üzeri sürümlerde, çekilebilir öğeler klasörüne yeni bir görüntü eklerken drawable-v24 yerine drawable seçeneğini seçin.görüntü açıklamasını buraya girin

Kullanmakta olduğunuz görüntü zaten bir (v24) ise, kopyalayın ve aynı dizine yapıştırın (örn. Çizimler). Bu sefer size hangi normal veya v24'ü soracak - sadece v24 olmadığından emin olun ve tekrar deneyin, bu hatayı düzeltmelidir.


Dikkat - "Android" görünümündeyseniz, "Proje" görünümüne geçin. Android görünümünde, drawables v24 dizinini göremeyebilirsiniz
Hatzil

2

Benimle de aynı sorun oldu ve ben de aynısını çözdüm

NEDEN : Bu, RemoteViews için vektör çizilebilir kullanmamız ve derleme zamanında çekilebilir vektör çekilebilir oluşturması nedeniyle oluyor. Ayrıca, uygulamayı geliştirirken bazı cihazların oluşturulan çekilebilir kaynaklar kimliğini neden algılayamadığından emin değilim. Ama evet nedeni buydu.

YENİDEN ÜRETME Adımları 1. Önceki yapıyı kurun. 2. Bir bildirim gönderin 3. Yapıyı bir sonraki sürüm koduyla güncelleyin 4. Uygulamayı güncelledikten sonra uygulamayı açmayın ve tekrar bildirim gönderin

ÇÖZÜM Vektör çizimini normal çekilebilir (.png veya .jpg) dosya ile değiştirin.

Umarım bu sorunu çözer.


1

Uygulamanız güncellenirken görünen bir bildiriminiz varsa, bununla karşılaşabilirsiniz. Yapmanız gereken şey, bir PACKAGE_CHANGED mesajını bekleyen bir BroadcastReceiver oluşturmaktır, bu noktada tüm hizmetlerinizi kapatırsınız ve bu da ilişkili bildirimlerini de kapatır.

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

0

Bir pakette bir bildirim ayarladığımda aynı sorunu yaşadım. Bunu denedim ve sorunumu çözdü:

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

SetLargeIcon () 'un setSmallIcon ()' dan önce çağrıldığından emin olun.


4
Bu neden yardımcı olmalı?
limitium

0

Ben de aynı sorunu yaşadım. Sorun, kullandığınız simgeyle ilgili, android.R.drawable.stat_sys_download kullanıyordum. Drawables.xml adresine gidin ve bunu yapıştırın.

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

ve sonra kodunuzda

builder.setSmallIcon(R.drawable.ic_start_download);

Bu resim yerine başka bir resim deneyebilirsiniz


0

Bunu çözme yolum: Düzenimde "kötü" görünümler vardı (örn: bir onay kutusu) - bu yüzden onları kaldırdım.

RemoteViews yalnızca resimleri ve metinleri destekliyor gibi görünüyor (belgeyi okuyarak onaylanacak).


0

Android.support.constraint.ConstraintLayout kullanırken RemoteServiceException vardı. LinearLayout veya Relative olarak değiştirin ve ayrıca android: layout_height = "wrap_content" container için


0

(Bu mevcut soru için bir çözüm değil, benzer temel sorunu olan birine yardımcı oluyor) Ben de aynı sorunu yaşadım, Ama benim durumumda aynı soruna neden olan bozuk .png dosyası kullandım. Bu yüzden onu sildim ve doğru .png dosyasını yeniden ekledim.


0

Lütfen özel bildirim düzeninden <android.support.v7.widget.AppCompatTextViewile değiştirin <TextView.

Çünkü android.support.v7.widget.AppCompatTextViewveya android.support.v7.widget.AppCompatImageViewsadece çalışma zamanında çalışır.

Yani kullanın TextViewveyaImageView



0

Projeyi senkronize edin ve Temizle'den sonra Dosya> Senkronize et ve ardından: Oluştur> Projeyi Temizle

Umarım bu hepinize yardımcı olur, bu benim için iş


0

Bildirim görünümünde metin görünümündeki otomatik bağlantı ve bağlantılar tıklanabilir seçenekler nedeniyle bu hatayı aldım:

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

Dikkatli ol!


-3

Bu benim için çalıştı . Simgenin referansını yorumlayın ve böylece NotificationCompat.Builder'ı sorunsuz bir şekilde kullanabilirsiniz.

    $msg_notificacion = [
                        'title'         => "titulonotif",
                       // "icon" : "myicon",
                        'body'          =>"cuerponotif"
                    ];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.