Come risolvere: android.app.RemoteServiceException: notifica errata inviata dal pacchetto *: impossibile creare l'icona: StatusBarIcon


127

Vedo la seguente eccezione nei registri degli arresti anomali:

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)

Sto inviando la mia notifica da un IntentService da un set PendingIntent tramite AlarmManager utilizzando il seguente metodo. Tutti i valori passati qui provengono dagli extra del pacchetto in 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());
}

Da quello che ho visto di altre risposte, l'eccezione che vedo accade quando setSmallIcon()non viene chiamata correttamente.

Ho verificato e ricontrollato che gli ID risorsa che vengono passati siano tutti corretti.


3
Riscontro lo stesso errore (rapporti sugli arresti anomali da un'app live). Non riesco a riprodurlo sul mio dispositivo. Attualmente sto pensando che la gente abbia modificato il .apk
oscuro il

Ragazzi, in che modo posso risolvere questo problema. Uso pngs, ma molto raramente si verificano arresti anomali delle app
user7856586,

Risposte:


98

Quello che stava succedendo era che stavo includendo il riferimento intero all'icona nel bundle PendingIntent, e quel numero intero veniva successivamente referenziato mentre veniva registrato nel NotificationManager.

Tra l'ottenimento del riferimento intero e l'intenzione in sospeso, l'app è stata aggiornata e tutti i riferimenti disegnabili sono stati modificati. Il numero intero che faceva riferimento al drawable corretto ora faceva riferimento al drawable errato o a nessuno (nessuno affatto - causando questo arresto anomalo)


8
Bizzarro. In altre parole, questo non è risolvibile, vero? Sto vedendo gli stessi arresti anomali nella mia app.
Matthias,

Non sembra riparabile. In futuro dovrò escogitare un modo diverso di pubblicare notifiche con immagini in futuro ....
FishStix

Che cosa succede se proviamo a impostare textSize della vista remota come ret.setInt (id, "setTextSize", 20); Si blocca anche. So che dobbiamo anche fornire le unità, ma come posso farlo con tale firma del metodo. Qualche puntatore ??
bitsabhi,

1
Potrebbe essere possibile cancellare la notifica e tutto ciò che è correlato quando l'app viene uccisa per essere aggiornata? (Supponendo che l'app eviterebbe il problema)
NoHarmDan

3
Nel caso in cui si desideri fare riferimento a R.drawable.my_image, è più sicuro salvarlo in bundle come una stringa ( bundle.putString("img", "my_image")e quindi convertirlo quando necessario nell'effettivo intero @DrawableRes come segue:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
vanomart

52

L'uso VectorXmlall'interno della notifica è noto per causare questo problema. Usa png


4
Si utilizzavano solo PNG.
FishStix,

Nel mio caso, avevo il vettore nella drawablecartella e il png è in drawable-hdpi, xhdpiecc. Ma non c'era il png per drawable-mdpi, ed è andato in crash sul dispositivo MDPI durante l'invio di una notifica.
Vadim Kotov,

34

Non usare SVG su Kitkat!

Ho avuto lo stesso problema ogni volta che volevo mostrare una notifica su Kitkat. Ciò che ha causato il problema per me è che ho definito ogni icona in xml (da svg), l'icona piccola e anche l'icona dell'azione. Dopo averli sostituiti con png-s il problema risolto al mio fianco.


4
Posso confermare. Disegnabili vettoriali nelle notifiche causano RemoteServiceException su KitKat.
Khizhny Andrey,

2
Nel caso di KitKat, il problema è stato risolto quando ho sostituito l'XML con PNG in: new NotificationCompat.Builder (context, CHANNEL_ID) .setSmallIcon (R.drawable.my_icon)
Andrew Glukhoff,

1
Questo ha funzionato per me. Stavo eseguendo API 19 e ho usato un file SVG per l'icona di notifica e mi stava dando questo errore, fino a quando non sono passato a una piccola icona png
WHOATEMYNOODLES

10

android.app.RemoteServiceException: notifica non valida pubblicata

Ho avuto lo stesso problema, ma sono stato risolto. Il mio problema è "file .xml" della vista remota.

Nel mio file XML sono stato aggiunto uno Viewtra il LinearLayoutdivisore for.

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

Quanto sopra View componente che crea l'eccezione di notifica non valida. Questo motivo di eccezione è solo il file xml di Remoteviews.

Dopo aver rimosso quel componente Visualizza, il mio codice è stato eseguito correttamente, senza alcuna eccezione. Quindi ho sentito che il cassetto delle notifiche non accettava alcuna vista personalizzata.

Quindi non disegnare nulla come la vista sopra nel file .xml RemoteViewdell'oggetto.


9

Il mio problema era che l'icona che stavo usando

.setSmallIcon(R.drawable.ic_stat_push_notif)

non è stato generato di conseguenza. Secondo il documento ufficiale :

Come descritto in Fornitura di set di icone specifici per la densità e supporto di più schermi, è necessario creare icone separate per tutte le densità di schermo generalizzate, inclusi schermi a bassa, media, alta ed extra alta densità. Ciò garantisce che le icone vengano visualizzate correttamente in tutta la gamma di dispositivi su cui è possibile installare l'applicazione.

Quindi il modo migliore per riempire quanto sopra, ho usato Notification Generator fornito da Roman Nurik su https://romannurik.github.io/AndroidAssetStudio/index.html

In questo modo, puoi usare un'immagine (tenendo presente che questo deve avere uno sfondo trasparente) e lasciare che il generatore faccia il lavoro per te generando le diverse dimensioni per le icone di notifica.

La cosa più importante è che se il generatore di icone dopo aver sfogliato l'immagine che stai per usare ti mostra un cerchio o un quadrato riempito di bianco, ci sono problemi con l'immagine, forse perché non ha lucidi, quindi assicurati che hai questo ok.


2
Nel mio caso, avevo il vettore nella drawablecartella e il png è in drawable-hdpi, xhdpiecc. Ma non c'era il png per drawable-mdpi, ed è andato in crash sul dispositivo MDPI durante l'invio di una notifica.
Vadim Kotov,

7

Nella mia app, questo tipo di bug si verifica solo durante l'aggiornamento. Se l'id della risorsa cambia nella versione più recente, Android RemoteViewpotrebbe non riuscire a trovare la risorsa e buttare via RemoteServiceException. Se pubblichi una terza versione e non modifichi l'ID della risorsa, i bug potrebbero scomparire solo temporaneamente .

È possibile ridurre questo tipo di bug modificando res/values/public.xmle res/values/ids.xml. Il compilatore genererà un ID risorsa individuale se l'id risorsa non è in public.xmloids.xml . Quando si modifica il nome della risorsa o si aggiungono alcune nuove risorse, l'id potrebbe cambiare e alcuni dispositivi potrebbero non trovarlo.

Quindi il passaggio è il seguente:

  1. Decompila il file apk e res/valuestrova il public.xmleids.xml
  2. Trova tutte le risorse relative a RemoteView nella tua app e copiale (stringhe, dimen, drawable, layout, id, color ...)
  3. Creare public.xmle ids.xmlsotto res/valuesnel codice sorgente e incollare le linee di u appena copiato

Nota:

Il grado 1.3.0 e successivi ignorano il locale public.xml. Per farlo funzionare, devi aggiungere alcuni script nel tuobuild.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)
            }
        }
    }
}

Nota: questo script non supporta il progetto di sottomoduli. Sto cercando di risolverlo.


3

Hai passato la stessa icona

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

e tu notifica

 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
Ho passato l'immagine vettoriale come risorsa e penso che abbia causato gli arresti anomali sui dispositivi OnePlus / Android 6. Non sono sicuro per il 100%.
Alexey,

3

Nel caso in cui l'icona non sia importante, è possibile sostituire,

R.drawable.your_icon

Per

android.R.drawable.some_standard_icon

Questo funziona!


2

Ho avuto RemoteServiceException quando l'uso Notification nella mia classe si estende da FirebaseMessagingService. Ho aggiunto il seguente codice ad AndroidManifest.xml:

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

Anche la risorsa ic_small è impostata nell'istanza di una classe Notification.Builder con il metodo setSmallIcon (icona int).


questi metadati devono essere aggiunti all'interno dei tag <service </service>?
Andrey,

2

In Android Studio versione 3.0.0 e successive, quando aggiungi una nuova immagine nella cartella dei disegni estraibili scegli drawable anziché drawable-v24.inserisci qui la descrizione dell'immagine

Se l'immagine, che stai utilizzando, è già a (v24), basta copiarla e incollarla nella stessa directory (es. Drawables). Questa volta ti chiederà quale regolare o v24 - assicurati solo che non sia il v24 e riprova questo dovrebbe correggere l'errore.


Avviso: se si è in vista "Android", passare alla vista "Progetto". Nella vista Android, potresti non vedere la directory v24 dei drawable
Hatzil,

2

Lo stesso problema si è verificato anche con me e ho risolto lo stesso

MOTIVO : Questo sta accadendo perché stiamo usando un disegno vettoriale per RemoteView e un disegno vettoriale genera un disegno al momento della compilazione. Inoltre, non sono sicuro del motivo per cui alcuni dispositivi non sono in grado di rilevare l'id delle risorse disegnabili generate mentre stiamo aumentando l'app. Ma sì, questo era il motivo.

RIPRODUCI Passaggi 1. Installa build precedente. 2. Invia una notifica 3. Aggiorna la build con il codice della versione successiva 4. Dopo aver aggiornato l'app non aprire l'app e inviare di nuovo la notifica

SOLUZIONE Sostituire il disegno vettoriale con un normale file disegno (.png o .jpg).

Spero che questo risolva il problema.


1

Se hai una notifica visibile mentre l'app è aggiornata, potresti imbatterti in questo. Quello che potresti dover fare è creare un BroadcastReceiver in attesa di un messaggio PACKAGE_CHANGED, a quel punto chiudi tutti i tuoi servizi che respingeranno anche le loro notifiche associate.

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

0

Ho avuto lo stesso problema quando ho impostato una notifica in un pacchetto. Ho provato questo e risolto il mio problema:

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

Assicurarsi che setLargeIcon () sia stato richiamato prima di setSmallIcon ().


4
Perché questo dovrebbe aiutare?
limitium

0

Anch'io ho avuto lo stesso problema. Il problema è con l'icona che stai usando, stavo usando android.R.drawable.stat_sys_download. Vai a drawables.xml e incollalo.

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

e poi nel tuo codice

builder.setSmallIcon(R.drawable.ic_start_download);

Puoi provare qualche altra immagine invece di questa immagine


0

Il mio modo di risolverlo: avevo viste "cattive" nel mio layout (es: una casella di controllo), quindi le ho rimosse.

Le RemoteView sembrano supportare solo immagini e testi (da confermare leggendo il documento).


0

Ho avuto RemoteServiceException quando uso android.support.constraint.ConstraintLayout. Cambialo in LinearLayout o Relative e anche android: layout_height = "wrap_content" per container


0

(questa non è una soluzione per la domanda attuale, ma aiuta qualcuno con un simile problema di base) Anch'io ho avuto lo stesso problema, ma nel mio caso ho usato un file .png corrotto che sta causando lo stesso problema. Quindi l'ho eliminato e ho incluso nuovamente il file .png corretto.


0

Si prega di sostituire <android.support.v7.widget.AppCompatTextView con <TextViewdal layout di notifica personalizzato.

Perché android.support.v7.widget.AppCompatTextViewo android.support.v7.widget.AppCompatImageViewfunziona solo in fase di esecuzione.

Quindi usa TextViewoImageView



0

Sincronizza il progetto e pulisci, File> Sincronizza quindi: Genera> Pulisci progetto

Spero che possa aiutare tutti voi, è lavoro per me


0

Ho riscontrato questo errore a causa del collegamento automatico e dei collegamenti Opzioni selezionabili nella visualizzazione testo nella vista di notifica:

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

Stai attento!


-3

Questo ha funzionato per me. Commenta il riferimento dell'icona e quindi puoi usare NotificationCompat.Builder senza problemi.

    $msg_notificacion = [
                        'title'         => "titulonotif",
                       // "icon" : "myicon",
                        'body'          =>"cuerponotif"
                    ];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.