So beheben Sie: android.app.RemoteServiceException: Fehlerhafte Benachrichtigung aus Paket *: Symbol konnte nicht erstellt werden: StatusBarIcon

127

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 von einem PendingIntent-Satz ü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 - die Ausnahme, die ich sehe, tritt auf, wenn sie setSmallIcon()nicht richtig aufgerufen wird.

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

FishStix
quelle
3
Ich habe den gleichen Fehler (Absturzberichte von einer Live-App). Ich kann es nicht auf meinem Gerät reproduzieren. Ich denke derzeit, es liegt daran, dass die Leute die .apk geändert haben
abdunkeln
Leute, auf welche Weise kann ich dieses Problem lösen? Ich benutze PNGs, aber sehr selten stürzt die App ab
user7856586

Antworten:

98

Was geschah, war, dass ich den Integer-Verweis auf das Symbol in das PendingIntent-Bundle aufgenommen habe und dieser Integer später beim Posten im NotificationManager referenziert wurde.

Zwischen dem Abrufen der Ganzzahlreferenz und dem Auslösen der ausstehenden Absicht wurde die App aktualisiert und alle zeichnbaren Referenzen geändert. Die Ganzzahl, die früher auf das richtige Zeichen verwies, bezog sich jetzt entweder auf das falsche Zeichen oder gar nicht (überhaupt keine - was zu diesem Absturz führte)

FishStix
quelle
8
Bizarr. Mit anderen Worten, das ist nicht reparabel, oder? Ich sehe die gleichen Abstürze in meiner App.
Matthias
Es scheint nicht reparabel. Ich werde in Zukunft einen anderen Weg finden müssen, um Benachrichtigungen mit Bildern in der Zukunft zu veröffentlichen ...
FishStix
Was ist, wenn wir versuchen, die Textgröße der Remote-Ansicht als ret.setInt festzulegen (id, "setTextSize", 20); Es stürzt auch ab. Ich weiß, dass wir auch die Einheiten bereitstellen müssen, aber wie mache ich das mit einer solchen Methodensignatur? Irgendein Zeiger?
Bitsabhi
1
Könnte es möglich sein, die Benachrichtigung und alles, was damit zusammenhängt, wenn die App beendet wird, zu löschen, um aktualisiert zu werden? (Vorausgesetzt, die App würde das Problem vermeiden)
NoHarmDan
3
Wenn Sie auf R.drawable.my_image verweisen möchten, ist es sicherer, es als Zeichenfolge zu bündeln ( bundle.putString("img", "my_image")und dann bei Bedarf wie folgt in die tatsächliche @ DrawableRes-Ganzzahl zu konvertieren:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
vanomart
52

Es VectorXmlist bekannt, dass die Verwendung in Ihrer Benachrichtigung dieses Problem verursacht. Verwenden Sie PNGs

Bubunyo Nyavor
quelle
4
Es wurden nur PNGs verwendet.
FishStix
In meinem Fall hatte ich Vektor in drawableOrdnern und PNGs in drawable-hdpi, xhdpiusw. Aber es gab keine png für drawable-mdpi, und es stürzte auf MDPI Gerät eine Benachrichtigung über die Entsendung.
Vadim Kotov
34

Verwenden Sie SVG nicht für Kitkat!

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, löste sich das Problem an meiner Seite.

Bendaf
quelle
4
Ich kann bestätigen. Vektorzeichnungen in Benachrichtigungen verursachen eine RemoteServiceException auf KitKat.
Khizhny Andrey
2
Im Fall von KitKat wurde das Problem behoben, als ich das XML durch PNG in: new NotificationCompat.Builder (Kontext, CHANNEL_ID) .setSmallIcon (R.drawable.my_icon) ersetzte
Andrew Glukhoff
1
Das hat bei mir funktioniert. Ich habe API 19 ausgeführt und eine SVG-Datei als Benachrichtigungssymbol verwendet und mir diesen Fehler
angezeigt
10

android.app.RemoteServiceException: Ungültige Benachrichtigung veröffentlicht

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

In meiner XML-Datei wurde eine Viewzwischen dem LinearLayoutfor-Teiler hinzugefügt .

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

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

Nach dem Entfernen dieser View-Komponente wurde Mein Code ausnahmslos ordnungsgemäß ausgeführt. Daher hatte ich das Gefühl, dass die Benachrichtigungsschublade keine benutzerdefinierten Ansichten akzeptiert.

Sie zeichnen also nichts wie die obige Ansicht in die XML-Datei des RemoteViewObjekts.

Kona Suresh
quelle
9

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 unter Bereitstellen dichtespezifischer Symbolsätze und Unterstützen mehrerer Bildschirme beschrieben, sollten Sie separate Symbole für alle allgemeinen Bildschirmdichten erstellen, einschließlich Bildschirmen mit niedriger, mittlerer, hoher und besonders hoher Dichte. Dadurch wird sichergestellt, dass Ihre Symbole auf allen Geräten, auf denen Ihre Anwendung installiert werden kann, ordnungsgemäß angezeigt werden.

Um dies zu erreichen , habe ich den von Roman Nurik unter https://romannurik.github.io/AndroidAssetStudio/index.html bereitgestellten Benachrichtigungsgenerator verwendet

Auf diese Weise können Sie ein Bild verwenden (unter Berücksichtigung dessen, dass dieses einen transparenten Hintergrund haben muss) und den Generator die Arbeit für Sie erledigen lassen, um die verschiedenen Größen für Benachrichtigungssymbole zu generieren.

Das Wichtigste ist, dass, wenn der Symbolgenerator nach dem Durchsuchen des zu verwendenden Bildes einen weiß gefüllten Kreis oder ein weißes Quadrat anzeigt, Probleme mit Ihrem Bild auftreten, möglicherweise weil es keine Transparentfolien aufweist. Stellen Sie daher sicher, dass du hast das ok

Carlos Daniel
quelle
2
In meinem Fall hatte ich Vektor in drawableOrdnern und PNGs in drawable-hdpi, xhdpiusw. Aber es gab keine png für drawable-mdpi, und es stürzte auf MDPI Gerät eine Benachrichtigung über die Entsendung.
Vadim Kotov
7

In meiner App tritt diese Art von Fehler nur während des Upgrades auf. Wenn sich die Ressourcen-ID in der neueren Version ändert, RemoteViewkann Android die Ressource möglicherweise nicht finden und die nicht mehr verwenden RemoteServiceException. Wenn Sie eine dritte Version veröffentlichen und die Ressourcen-ID nicht ändern, verschwinden die Fehler möglicherweise nur vorübergehend .

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

Der Schritt ist also wie folgt:

  1. Dekompiliere die apk-Datei und res/valuesfinde das public.xmlundids.xml
  2. Finden Sie alle Ressourcen zu RemoteView in Ihrer App und kopieren Sie sie (Zeichenfolgen, Maß, Zeichnung, Layout, ID, Farbe ...).
  3. Erstellen Sie public.xmlund ids.xmlunter res/valuesin Ihrem Quellcode und fügen Sie die Zeilen ein, die Sie gerade kopiert haben

Hinweis:

Gradle 1.3.0 und höher ignorieren die lokalen public.xml. Damit es funktioniert, müssen Sie ein Skript in Ihre hinzufügenbuild.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)
            }
        }
    }
}

Hinweis: Dieses Skript unterstützt kein Submodulprojekt. Ich versuche es zu beheben.

Donnerschlag
quelle
3

Sie haben das gleiche Symbol übergeben

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

und Sie Benachrichtigung

 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
quelle
2
Ich habe das Vektorbild als Ressource übergeben und ich denke, es hat die Abstürze auf oneplus / android 6-Geräten verursacht. Nicht sicher für 100%.
Alexey
3

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

R.drawable.your_icon

Zu

android.R.drawable.some_standard_icon

Das funktioniert!

Ashwin Balani
quelle
2

Ich hatte eine RemoteServiceException, wenn die Verwendung der Benachrichtigung in meiner Klasse von FirebaseMessagingService ausgeht. 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 die Ressource ic_small wird in der Instanz einer Klasse Notification.Builder nach der Methode setSmallIcon (int icon) festgelegt.

Вячеслав Бондаренко
quelle
Müssen diese Metadaten in die Tags <service </ service> eingefügt werden?
Andrey
2

Wenn Sie in Android Studio Version 3.0.0 und höher ein neues Bild im Ordner drawables hinzufügen, wählen Sie drawable anstelle von drawable-v24.Geben Sie hier die Bildbeschreibung ein

Wenn das von Ihnen verwendete Bild bereits a (v24) ist, kopieren Sie es einfach und fügen Sie es in dasselbe Verzeichnis ein (z. B. Drawables). Dieses Mal werden Sie gefragt, welches reguläre oder v24 - wählen Sie einfach, dass es nicht das v24 ist, und versuchen Sie es erneut. Dies sollte den Fehler beheben.

Haider Malik
quelle
Hinweis - Wenn Sie sich in der Ansicht "Android" befinden, wechseln Sie in die Ansicht "Projekt". In der Android-Ansicht sehen Sie möglicherweise nicht das Verzeichnis drawables v24
Hatzil
2

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

GRUND : Dies geschieht, weil wir Vector Drawable für RemoteViews verwenden und Vector Drawable Generate Drawable zur Kompilierungszeit generiert. Ich bin mir auch nicht sicher, warum einige Geräte die generierte ID für zeichnbare Ressourcen nicht erkennen können, während wir die App aktualisieren. Aber ja das war der Grund.

REPRODUZIEREN 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 Aktualisieren der App die App nicht und senden Sie die Benachrichtigung erneut

LÖSUNG Ersetzen Sie den Vektor, der gezeichnet werden kann, durch eine normale Zeichnungsdatei (.png oder .jpg).

Ich hoffe das löst das Problem.

Gajju
quelle
1

Wenn während der Aktualisierung Ihrer App eine Benachrichtigung angezeigt wird, wird diese möglicherweise ausgeführt. Möglicherweise müssen Sie einen BroadcastReceiver erstellen, der auf eine PACKAGE_CHANGED-Nachricht wartet. An diesem Punkt fahren Sie alle Ihre Dienste herunter, wodurch auch die zugehörigen Benachrichtigungen verworfen werden.

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

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

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

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

Gelee
quelle
4
Warum sollte das helfen?
Limitium
0

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 Ihrem Code

builder.setSmallIcon(R.drawable.ic_start_download);

Sie können anstelle dieses Bildes auch ein anderes Bild ausprobieren

karthik vishnu kumar
quelle
0

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

RemoteViews scheinen nur Bilder und Texte zu unterstützen (dies wird durch Lesen des Dokuments bestätigt).

Benjamin Piette
quelle
0

Ich hatte RemoteServiceException bei Verwendung von android.support.constraint.ConstraintLayout. Ändern Sie es in LinearLayout oder Relative und auch android: layout_height = "wrap_content" für Container

JustAndrew
quelle
0

(Dies ist keine Lösung für die aktuelle Frage, hilft aber jemandem mit ähnlichen Kernproblemen.) Auch ich hatte das gleiche Problem. In meinem Fall habe ich jedoch eine beschädigte PNG-Datei verwendet, die das gleiche Problem verursacht. Also habe ich es gelöscht und die richtige PNG-Datei wieder aufgenommen.

RameshJanagama
quelle
0

Bitte ersetzen Sie <android.support.v7.widget.AppCompatTextViewmit <TextViewaus der benutzerdefinierten Benachrichtigung Layout.

Weil android.support.v7.widget.AppCompatTextViewoder android.support.v7.widget.AppCompatImageViewnur zur Laufzeit funktioniert.

Also benutze TextViewoderImageView

Ahamadullah Saikat
quelle
0

Wenn noch jemand mit diesem Problem konfrontiert ist: Fügen Sie in Ihrem Zeichenordner eine PNG-Datei mit dem Namen ic_stat_ic_notification (oder einem beliebigen Namen, den Sie mögen) hinzu.

und fügen Sie in Ihrem Manifest unten einige Zeilen hinzu

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

Jayapen Jose
quelle
0

Synchronisieren Sie das Projekt und dann Bereinigen Sie Datei> Synchronisieren und dann: Erstellen> Projekt bereinigen

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

der echte Napster
quelle
0

Ich habe diesen Fehler aufgrund von Autolink- und LinksClickable-Optionen in der Textansicht in der Benachrichtigungsansicht erhalten:

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

Achtung!

Meister
quelle
-3

Das hat bei mir funktioniert . Kommentieren Sie die Referenz des Symbols und können Sie den NotificationCompat.Builder problemlos verwenden.

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