wake-up-neo.com

Fehlerbehebung: Android.app.RemoteServiceException: Fehlerhafte Benachrichtigung aus Paket *: Symbol konnte nicht erstellt werden: StatusBarIcon

In Absturzprotokollen wird die folgende Ausnahme angezeigt:

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)

Ich poste meine Benachrichtigung von einem IntentService aus einem PendingIntent-Set über den AlarmManager mit der folgenden Methode. Alle hier übergebenen Werte stammen aus den Bundle-Extras im 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());
}

Nach dem, was ich von anderen Antworten gesehen habe, passiert die Ausnahme, die ich sehe, wenn setSmallIcon() nicht richtig aufgerufen wird.

Ich habe überprüft und überprüft, ob die übergebenen Ressourcen-IDs korrekt sind.

95
FishStix

Was geschah, war, dass ich den ganzzahligen Verweis auf das Symbol in das PendingIntent-Bundle aufgenommen habe. Diese Ganzzahl wurde später referenziert, während sie an den NotificationManager gesendet wurde.

Zwischen dem Abrufen der Ganzzahlreferenz und der ausstehenden Absicht wurde die App aktualisiert, und alle Zeichenreferenzen wurden geändert. Die Ganzzahl, die früher auf das korrekte Zeichenelement Bezug genommen hat, referenzierte jetzt entweder auf das falsche Zeichenelement oder auf keines (überhaupt nicht - dies verursacht diesen Absturz).

86
FishStix

Es ist bekannt, dass die Verwendung von VectorXml in Ihrer Benachrichtigung dieses Problem verursacht. Verwenden Sie png's

39
bubunyo

Ich hatte jedes Mal das gleiche Problem, wenn ich eine Benachrichtigung über KitKat anzeigen wollte. Was das Problem für mich verursacht hat, ist, dass ich jedes Symbol in xml (von svg), das kleine Symbol und das Aktionssymbol definiert habe. Nachdem ich sie durch png-s ersetzt habe, wurde das Problem an meiner Seite gelöst. 

12
bendaf

Android.app.RemoteServiceException: Fehlerhafte Benachrichtigung gepostet

Ich hatte das gleiche Problem, wurde aber gelöst. Mein Problem ist ".xml-Datei" der Remote-Ansicht.

In meiner XML-Datei wurde eine View zwischen der LinearLayout für den Teiler hinzugefügt.

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

Die obige View-Komponente erstellt die Ausnahme für fehlerhafte Benachrichtigungen. Dieser Ausnahmegrund ist nur eine XML-Datei von Remoteviews.

Nach dem Entfernen dieser Ansichtskomponente wurde der Code ohne Ausnahme ordnungsgemäß ausgeführt. Ich habe also das Gefühl, dass das Benachrichtigungsfach keine benutzerdefinierten Ansichten akzeptiert.

Sie zeichnen also nichts wie die obige Ansicht in der .xml-Datei des RemoteView-Objekts.

8
Kona Suresh

In meiner App tritt dieser Fehler nur während des Upgrades auf. Wenn sich die Ressourcen-ID in der neueren Version ändert, kann Android RemoteView die Ressource möglicherweise nicht finden und die RemoteServiceException auswerfen. Wenn Sie eine 3. Version veröffentlichen und die Ressourcen-ID nicht ändern, können die Fehler verschwinden nur vorübergehend .

Es ist möglich, diese Art von Fehlern durch Bearbeiten von res/values/public.xml und res/values/ids.xml zu reduzieren. Der Compiler generiert eine individuelle Ressourcen-ID, wenn die Ressourcen-ID nicht in public.xml oder ids.xml enthalten ist. Wenn Sie den Ressourcennamen ändern oder neue Ressourcen hinzufügen, ändert sich die ID möglicherweise und einige Geräte können sie nicht finden. 

Der Schritt ist also wie folgt:

  1. Dekompilieren Sie die apk-Datei und suchen Sie in res/values nach public.xml und ids.xml
  2. Finden Sie alle Ressourcen, die sich auf RemoteView beziehen, in Ihrer App und kopieren Sie sie (Strings, Dimen, Drawable, Layout, ID, Color ...).
  3. Erstellen Sie public.xml und ids.xml unter res/values in Ihrem Quellcode und fügen Sie die kopierten Zeilen ein

Hinweis:

Gradle 1.3.0 und höher ignorieren den lokalen public.xml. Damit es funktioniert, müssen Sie ein Skript in Ihren build.gradle einfügen.

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)
            }
        }
    }
}

Hinweis: Dieses Skript unterstützt kein Submodul-Projekt. Ich versuche es zu reparieren.

5
thundertrick

Mein Problem war, dass das Symbol, das ich verwendet habe 

.setSmallIcon(R.drawable.ic_stat_Push_notif)

wurde nicht entsprechend generiert. Laut dem offiziellen Dokument

Wie in Dichte-spezifische Symbolsätze bereitstellen und unterstützen Bei mehreren Bildschirmen sollten Sie separate Symbole für alle verallgemeinerten .__ erstellen. Bildschirmdichten, einschließlich niedriger, mittlerer, hoher und __. Bildschirme mit besonders hoher Dichte. Dadurch wird sichergestellt, dass Ihre Symbole angezeigt werden ordnungsgemäß über den Bereich der Geräte, auf denen sich Ihre Anwendung befinden kann Eingerichtet.

Um den oben genannten Zweck am besten zu erfüllen, habe ich Notification Generator verwendet, der von Roman Nurik unter https://romannurik.github.io/AndroidAssetStudio/index.html bereitgestellt wird

Auf diese Weise können Sie ein Bild verwenden (wobei zu berücksichtigen ist, dass dieses einen transparenten Hintergrund haben muss) und der Generator die Aufgabe übernehmen kann, die verschiedenen Größen für Benachrichtigungssymbole zu generieren.

Das Wichtigste ist, dass der Symbolgenerator nach dem Durchsuchen des Bildes, das Sie verwenden möchten, einen weißen Kreis oder ein weißes Quadrat anzeigt, Probleme mit Ihrem Bild auftreten, möglicherweise weil es keine Transparenzen hat du hast das ok.

3
Carlos Daniel

Sie haben dasselbe Symbol übergeben 

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

und Sie benachrichtigen 

 NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this, channelId)
                        .setSmallIcon(R.drawable.ic_stat_name)
                        .setContentTitle("Title")
                        .setContentText(messageBody)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);
3
Tarun Umath

Ich hatte RemoteServiceException, wenn sich Notification in meiner Klasse von FirebaseMessagingService aus erstreckt. Ich habe den folgenden Code zu AndroidManifest.xml hinzugefügt:

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

Auch resource ic_small in Instanz einer Klasse Notification.Builder nach Methode setSmallIcon (int-Symbol) gesetzt.

Synchronisieren Sie das Projekt und säubern Sie es, Datei> Synchronisieren und dann Build> Clean Project

Ich hoffe, das wird euch allen helfen. Es funktioniert für mich

1

Ich hatte das gleiche Problem, als ich eine Benachrichtigung in einem Bundle setzte. Ich habe es versucht und mein Problem gelöst:

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

Stellen Sie sicher, dass setLargeIcon () vor setSmallIcon () aufgerufen wurde.

0
Jelly

Mein Weg, dies zu lösen: Ich hatte "schlechte" Ansichten in meinem Layout (zB ein Kontrollkästchen) - also entfernte ich sie.

RemoteViews scheinen nur Bilder und Texte zu unterstützen (durch das Lesen des Dokuments zu bestätigen).

0
Benjamin Piette

Falls noch jemand mit diesem Problem konfrontiert ist: Fügen Sie eine Png-Datei mit dem Namen ic_stat_ic_notification (oder einem beliebigen Namen, den Sie mögen)

und fügen Sie in Ihrem Manifest unten ein paar Zeilen hinzu

und Sie können hier Ihre Icons erstellen -> https://romannurik.github.io/AndroidAssetStudio/icon

0
Jayapen Jose

Ich hatte RemoteServiceException, wenn ich Android.support.constraint.ConstraintLayout verwende. Ändern Sie ihn in LinearLayout oder Relative Und auch Android: layout_height = "wrap_content" für Container

0
JustAndrew

(Dies ist keine Lösung für die aktuelle Frage, hilft aber jemandem mit einem ähnlichen Kernproblem). Also habe ich es gelöscht und die korrekte .png-Datei wieder eingefügt.

0
RameshJanagama

Ersetzen Sie <Android.support.v7.widget.AppCompatTextView durch<TextViewaus dem benutzerdefinierten Benachrichtigungslayout. 

Weil Android.support.v7.widget.AppCompatTextView oder Android.support.v7.widget.AppCompatImageView nur zur Laufzeit funktioniert.

Verwenden Sie alsoTextViewoderImageView

0

Wenn Sie in Android Studio Version 3.0.0 und höher ein neues Bild im Drawables-Ordner hinzufügen, wählen Sie drawable anstelle von drawable-v24.  enter image description here

Wenn das von Ihnen verwendete Bild bereits ein (v24) ist, kopieren Sie es einfach und fügen es in dasselbe Verzeichnis ein (z. B. drawables). Dieses Mal werden Sie gefragt, welches reguläre oder v24 - stellen Sie einfach sicher, dass es nicht das v24 ist, und versuchen Sie es erneut.

0
Haider Malik

Nur für den Fall, dass das Symbol nicht wichtig ist, können Sie Folgendes ersetzen:

R.drawable.your_icon

Zu

Android.R.drawable.some_standard_icon

Das funktioniert!

0
Ashwin Balani

Das gleiche Problem ist auch bei mir aufgetreten und ich habe das Gleiche gelöst

REASON: Dies geschieht, weil wir Vektorbilder verwenden, die für RemoteViews gezeichnet werden können, und Vektorzeichnungen, die zum Zeitpunkt der Kompilierung gezeichnet werden können. Ich bin mir auch nicht sicher, warum einige Geräte die generierte Ressource-ID nicht erkennen können, während wir die App hochfahren. Aber das war der Grund.

REPRODUZIERE Schritte 1. Installieren Sie den vorherigen Build . 2. Senden Sie eine Benachrichtigung 3. Aktualisieren Sie den Build mit dem nächsten Versionscode 4. Öffnen Sie nach dem Update der App die App nicht mehr und senden Sie die Benachrichtigung erneut

L&OUML;SUNG Ersetzen Sie den Vektor durch eine normale Zeichendatei (.png oder .jpg).

Ich hoffe das löst das Problem.

0
Gajju

Ich hatte auch das gleiche Problem. Das Problem ist mit dem Symbol, das Sie verwenden, ich habe Android.R.drawable.stat_sys_download verwendet. Gehen Sie zu drawables.xml und fügen Sie diese ein.

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

und dann in deinem Code

builder.setSmallIcon(R.drawable.ic_start_download);

Sie können anstelle dieses Bildes ein anderes Bild ausprobieren