Cómo solucionarlo: android.app.RemoteServiceException: notificación incorrecta publicada desde el paquete *: no se pudo crear el icono: StatusBarIcon

127

Veo la siguiente excepción en los registros de bloqueo:

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)

Estoy publicando mi notificación desde un IntentService desde un conjunto PendingIntent a través del AlarmManager usando el siguiente método. Todos los valores pasados ​​aquí son de los extras del paquete en el 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());
}

Por lo que he visto de otras respuestas, la excepción que veo ocurre cuando setSmallIcon()no se llama correctamente.

Verifiqué y verifiqué dos veces que las ID de recursos que se pasan sean correctas.

FishStix
fuente
3
Estoy experimentando el mismo error (informes de fallos de una aplicación en vivo). No puedo reproducirlo en mi dispositivo. Actualmente estoy pensando que es porque la gente modificó el .apk
oscurecer el
Chicos, ¿de qué manera puedo resolver este problema? Yo uso pngs, pero muy rara vez la aplicación se bloquea
user7856586

Respuestas:

98

Lo que estaba sucediendo era que estaba incluyendo la referencia entera al ícono en el paquete PendingIntent, y luego se hizo referencia a ese entero mientras se publicaba en el NotificationManager.

Entre la obtención de la referencia entera y la intención pendiente de apagarse, la aplicación se actualizó y todas las referencias dibujables cambiaron. El entero que solía hacer referencia al dibujo correcto ahora hacía referencia al dibujo incorrecto o ninguno en absoluto (ninguno en absoluto, lo que provoca este bloqueo)

FishStix
fuente
8
Extraño. En otras palabras, esto no es reparable, ¿verdad? Estoy viendo los mismos bloqueos en mi aplicación.
Matthias
No parece reparable. En el futuro, tendré que idear una forma diferente de publicar notificaciones con imágenes en el futuro ...
FishStix
¿Qué pasa si intentamos establecer el textSize de la vista remota como ret.setInt (id, "setTextSize", 20); También se bloquea. Sé que también tenemos que proporcionar las unidades, pero ¿cómo hago eso con la firma de dicho método? Cualquier puntero?
bitsabhi
1
¿Podría ser posible borrar la notificación y todo lo relacionado cuando se mata la aplicación para actualizarla? (Suponiendo que eso haría que la aplicación evite el problema)
NoHarmDan
3
En caso de que desee hacer referencia a R.drawable.my_image, es más seguro guardarlo para agruparlo como una cadena ( bundle.putString("img", "my_image")y luego convertirlo cuando sea necesario al entero @DrawableRes real de la siguiente manera:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
vanomart
52

VectorXmlSe sabe que el uso dentro de su notificación causa este problema. Use png

Bubunyo Nyavor
fuente
44
Solo se estaban utilizando PNG.
FishStix
En mi caso, tuve vector en drawablecarpeta y png de en drawable-hdpi, xhdpi, etc, pero no había png para drawable-mdpi, y se estrelló en el dispositivo MDPI en la publicación de una notificación.
Vadim Kotov
34

¡No uses SVG en Kitkat!

Tuve el mismo problema cada vez que quería mostrar una notificación en Kitkat. Lo que me causó el problema es que he definido todos los íconos en xml (desde svg), el ícono pequeño y el ícono de acción también. Después de haberlos reemplazado con png-s, el problema se resolvió a mi lado.

bendaf
fuente
44
Puedo confirmar. Los dibujos vectoriales en las notificaciones causan RemoteServiceException en KitKat.
Khizhny Andrey
2
En el caso de KitKat, el problema se resolvió cuando reemplacé el XML con PNG en: nuevo NotificationCompat.Builder (context, CHANNEL_ID) .setSmallIcon (R.drawable.my_icon)
Andrew Glukhoff
1
Esto funcionó para mí. Estaba ejecutando API 19 y usé un archivo SVG para el icono de notificación y me estaba dando este error, hasta que lo
cambié
10

android.app.RemoteServiceException: notificación incorrecta publicada

Tuve el mismo problema, pero estaba resuelto. Mi problema es el "archivo .xml" de la Vista remota.

En mi archivo xml me agregaron uno Viewentre el LinearLayoutdivisor for.

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

El Viewcomponente anterior que crea la excepción de notificación incorrecta. Este motivo de excepción es solo un archivo xml de Remoteviews.

Después de eliminar ese componente Ver, Mi código se ejecutó correctamente, sin ninguna excepción. Entonces sentí que el cajón de notificaciones no aceptaba ninguna vista personalizada.

Por lo tanto, no dibuja nada como la vista anterior en el archivo de RemoteViewobjeto .xml .

Kona Suresh
fuente
9

Mi problema fue que el ícono que estaba usando en

.setSmallIcon(R.drawable.ic_stat_push_notif)

no se generó en consecuencia. Según el documento oficial :

Como se describe en Proporcionar conjuntos de iconos específicos de densidad y admitir pantallas múltiples, debe crear iconos separados para todas las densidades de pantalla generalizadas, incluidas las pantallas de densidad baja, media, alta y extra alta. Esto garantiza que sus iconos se mostrarán correctamente en toda la gama de dispositivos en los que se puede instalar su aplicación.

Entonces, la mejor manera de completar lo anterior, utilicé el Generador de notificaciones proporcionado por Roman Nurik en https://romannurik.github.io/AndroidAssetStudio/index.html

De esa manera, puede usar una imagen (teniendo en cuenta que debe tener un fondo transparente) y dejar que el generador haga el trabajo por usted generando los diferentes tamaños para los iconos de notificación.

Lo más importante es que si el generador de iconos después de explorar la imagen que va a utilizar le muestra un círculo o cuadrado relleno de blanco, hay problemas con su imagen, tal vez porque no tiene transparencias, así que asegúrese de que tienes esto ok

Carlos Daniel
fuente
2
En mi caso, tuve vector en drawablecarpeta y png de en drawable-hdpi, xhdpi, etc, pero no había png para drawable-mdpi, y se estrelló en el dispositivo MDPI en la publicación de una notificación.
Vadim Kotov
7

En mi aplicación, este tipo de error ocurre solo durante la actualización. Si la identificación del recurso cambia en la versión más reciente, Android RemoteViewpuede fallar al encontrar el recurso y descartar el RemoteServiceException. Si publica una tercera versión y no cambia la identificación del recurso, los errores pueden desaparecer solo temporalmente .

Es posible reducir este tipo de errores editando res/values/public.xmly res/values/ids.xml. El compilador generará una identificación de recurso individual si la identificación del recurso no está en public.xmlo ids.xml. Cuando cambia el nombre del recurso o agrega algunos recursos nuevos, la identificación puede cambiar y algunos dispositivos pueden no encontrarlo.

Entonces el paso es el siguiente:

  1. Descompilar el archivo apk y en res/valuesencontrar el public.xmlyids.xml
  2. Encuentre todos los recursos relacionados con RemoteView en su aplicación y cópielos (cadenas, dimen, dibujables, diseño, id, color ...)
  3. Cree public.xmly ids.xmldebajo res/valuesen su código fuente y pegue las líneas que acaba de copiar

Nota:

Gradle 1.3.0 y superior ignoran lo local public.xml. Para que funcione, debe agregar algún script en subuild.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: Este script no es compatible con el proyecto de submódulos. Estoy tratando de arreglarlo.

Thundertrick
fuente
3

Has pasado el mismo ícono

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

y tu notificación

 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
fuente
2
He pasado la imagen vectorial como recurso y creo que causó fallas en los dispositivos oneplus / android 6. No estoy seguro para el 100%.
Alexey
3

En caso de que el icono no sea importante, puede reemplazarlo,

R.drawable.your_icon

A

android.R.drawable.some_standard_icon

¡Esto funciona!

Ashwin Balani
fuente
2

Tuve RemoteServiceException cuando uso Notification en mi clase se extiende desde FirebaseMessagingService. Agregué el siguiente código a AndroidManifest.xml:

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

También recurso ic_small establecido en la instancia de una clase Notification.Builder por el método setSmallIcon (ícono int).

Вячеслав Бондаренко
fuente
estos metadatos deben agregarse dentro de las etiquetas <service </service>?
Andrey
2

En Android Studio versión 3.0.0 y superior, al agregar una nueva imagen en la carpeta de dibujables, elija dibujable en lugar de dibujable-v24.ingrese la descripción de la imagen aquí

Si la imagen que está utilizando ya está en un (v24), simplemente cópiela y péguela en su mismo directorio (por ejemplo, drawables). Esta vez le preguntará qué regular o v24, solo asegúrese de que no sea el v24 y vuelva a intentarlo, esto debería solucionar el error.

Haider Malik
fuente
Aviso: si está en la vista "Android", cámbielo a la vista "Proyecto". En la vista de Android, es posible que no vea el directorio de
drawables v24
2

El mismo problema ocurrió conmigo y resolví lo mismo

MOTIVO : Esto está sucediendo porque estamos usando vector drawable para RemoteViews y vector drawable genera dibujable en tiempo de compilación. Además, no estoy seguro de por qué algunos dispositivos no pueden detectar la identificación de recursos extraíbles generados mientras estamos subiendo la aplicación. Pero sí, esta fue la razón.

REPRODUCCIÓN Pasos 1. Instale la compilación anterior. 2. Enviar una notificación 3. Actualice la compilación con el siguiente código de versión 4. Después de actualizar la aplicación, no abra la aplicación y envíe la notificación nuevamente

SOLUCIÓN Reemplace el vector dibujable con un archivo dibujable normal (.png o .jpg).

Espero que esto resuelva el problema.

Gajju
fuente
1

Si tiene una notificación visible mientras se actualiza su aplicación, puede encontrarse con esto. Lo que puede que tenga que hacer es crear un BroadcastReceiver que espere un mensaje PACKAGE_CHANGED, en el momento en que cierre todos sus servicios, lo que también descartará sus notificaciones asociadas.

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

Tuve el mismo problema cuando configuré una notificación en un paquete. Intenté esto y resolvió mi problema:

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

Asegúrese de que setLargeIcon () se invoque antes de setSmallIcon ().

Gelatina
fuente
44
¿Por qué debería ayudar esto?
limitium
0

Yo también tuve el mismo problema. El problema es con el icono que está utilizando, estaba usando android.R.drawable.stat_sys_download. Vaya a drawables.xml y pegue esto.

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

y luego en tu código

builder.setSmallIcon(R.drawable.ic_start_download);

Puedes probar alguna otra imagen en lugar de esta imagen

karthik vishnu kumar
fuente
0

Mi forma de resolver esto: tenía vistas "malas" en mi diseño (por ejemplo, una casilla de verificación), así que las eliminé.

RemoteViews parece admitir solo imágenes y textos (para confirmar al leer el documento).

Benjamin Piette
fuente
0

Tuve RemoteServiceException cuando uso android.support.constraint.ConstraintLayout. Cámbielo a LinearLayout o Relative y también android: layout_height = "wrap_content" para el contenedor

JustAndrew
fuente
0

(esta no es la solución para la pregunta actual, pero ayuda a alguien con un problema central similar) Yo también tuve el mismo problema, pero en mi caso he usado un archivo .png corrupto que está causando el mismo problema. Así que lo eliminé y volví a incluir el archivo .png correcto.

RameshJanagama
fuente
0

Reemplácelo <android.support.v7.widget.AppCompatTextViewcon <TextViewun diseño de notificación personalizado.

Porque android.support.v7.widget.AppCompatTextViewo android.support.v7.widget.AppCompatImageViewsolo funciona en tiempo de ejecución.

Entonces use TextViewoImageView

Ahamadullah Saikat
fuente
0

Si alguien aún enfrenta este problema: agregue un archivo png en su carpeta dibujable con el nombre ic_stat_ic_notification (o cualquier nombre que desee)

y en su manifiesto agregue debajo un par de líneas

y puedes crear tus íconos aquí -> https://romannurik.github.io/AndroidAssetStudio/icon

Jayapen Jose
fuente
0

Sincronice el proyecto y luego límpielo, Archivo> Sincronizar y luego: Compilar> Limpiar proyecto

Espero que eso los ayude a todos, es trabajo para mí

la verdadera napster
fuente
0

Recibí este error debido al enlace automático y a las opciones de enlaces en la vista de texto en la vista de notificaciones:

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

¡Ten cuidado!

Maestro
fuente
-3

Esto funcionó para mí. Comente la referencia del icono y así podrá usar NotificationCompat.Builder sin problemas.

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