W dziennikach awarii widzę następujący wyjątek:
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)
Publikuję moje powiadomienie z IntentService z zestawu PendingIntent za pośrednictwem AlarmManager przy użyciu następującej metody. Wszystkie wartości przekazywane tutaj pochodzą z dodatków pakietu w 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());
}
Z tego, co widziałem w przypadku innych odpowiedzi - wyjątek, który widzę, ma miejsce, gdy setSmallIcon()
nie jest poprawnie wywołany.
Sprawdziłem i dwukrotnie sprawdziłem, czy przekazywane identyfikatory zasobów są poprawne.
Odpowiedzi:
To, co się działo, polegało na tym, że dołączałem odwołanie do ikony w pakiecie PendingIntent jako liczbę całkowitą, a ta liczba całkowita była później przywoływana podczas wysyłania do NotificationManager.
Pomiędzy pobraniem odwołania w postaci liczby całkowitej a wyłączeniem oczekującej intencji aplikacja została zaktualizowana, a wszystkie odniesienia do rysowania zostały zmienione. Liczba całkowita, która kiedyś odwoływała się do właściwego elementu rysunkowego, teraz odnosiła się do nieprawidłowego elementu rysunkowego lub w ogóle go nie zawiera (brak w ogóle - powodując awarię)
źródło
bundle.putString("img", "my_image")
a następnie przekonwertować w razie potrzeby na rzeczywistą liczbę całkowitą @DrawableRes w następujący sposób:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
VectorXml
Wiadomo, że użycie wewnątrz powiadomienia powoduje ten problem. Użyj pngźródło
drawable
folderze i PNG wdrawable-hdpi
,xhdpi
itp Ale nie było dla pngdrawable-mdpi
, i rozbił się na urządzeniu MDPI na zamieszczając powiadomienie.Miałem ten sam problem za każdym razem, gdy chciałem pokazać powiadomienie na Kitkacie. To, co spowodowało u mnie problem, to to, że zdefiniowałem każdą ikonę w xml (z svg), małą ikonę i również ikonę akcji. Po ich wymianie na png-s problem rozwiązał się po mojej stronie.
źródło
android.app.RemoteServiceException: wysłano złe powiadomienie
Miałem ten sam problem, ale został rozwiązany. Mój problem dotyczy „pliku xml” widoku zdalnego.
W moim pliku xml zostałem dodany
View
międzyLinearLayout
separatorem for.Powyższy
View
komponent tworzy wyjątek złego powiadomienia. Ten wyjątek dotyczy tylko pliku XML Remoteviews.Po usunięciu tego składnika View mój kod wykonywał się poprawnie, bez żadnych wyjątków. Więc czułem, że szuflada powiadomień nie akceptuje żadnych niestandardowych widoków.
Więc nie rysujesz niczego takiego jak powyższy widok w pliku .xml
RemoteView
obiektu.źródło
Mój problem polegał na tym, że ikona, której używałem
nie został odpowiednio wygenerowany. Według oficjalnego dokumentu :
Najlepszym sposobem na wypełnienie powyższego było więc skorzystanie z Generatora Powiadomień dostarczonego przez Romana Nurika na https://romannurik.github.io/AndroidAssetStudio/index.html
W ten sposób możesz użyć obrazu (biorąc pod uwagę, że musi on mieć przezroczyste tło) i pozwolić generatorowi wykonać zadanie za Ciebie, generując różne rozmiary ikon powiadomień.
Najważniejsze jest to, że jeśli generator ikon po przejrzeniu obrazu, którego zamierzasz użyć, pokazuje białe wypełnione kółko lub kwadrat, są problemy z twoim obrazem, być może dlatego, że nie ma żadnych przezroczystości, więc upewnij się, że masz to ok.
źródło
drawable
folderze i PNG wdrawable-hdpi
,xhdpi
itp Ale nie było dla pngdrawable-mdpi
, i rozbił się na urządzeniu MDPI na zamieszczając powiadomienie.W mojej aplikacji ten błąd występuje tylko podczas aktualizacji. Jeśli identyfikator zasobu zmieni się w nowszej wersji, system Android
RemoteView
może nie znaleźć zasobu i wyrzucić plikRemoteServiceException
. Jeśli opublikujesz trzecią wersję i nie zmienisz identyfikatora zasobu, błędy mogą zniknąć tylko tymczasowo .Możliwe jest ograniczenie tego rodzaju błędów poprzez edycję
res/values/public.xml
ires/values/ids.xml
. Kompilator wygeneruje indywidualny identyfikator zasobu, jeśli identyfikator zasobu nie znajduje się wpublic.xml
lubids.xml
. Kiedy zmienisz nazwę zasobu lub dodasz nowe zasoby, identyfikator może się zmienić, a niektóre urządzenia mogą go nie znaleźć.Tak więc krok jest następujący:
res/values
znajdźpublic.xml
iids.xml
public.xml
iids.xml
podres/values
kodem źródłowym i wklej skopiowane linieUwaga:
Gradle 1.3.0 i nowsze wersje ignorują lokalny plik
public.xml
. Aby to działało, musisz dodać skrypt w swoimbuild.gradle
Uwaga: ten skrypt nie obsługuje projektu modułów podrzędnych. Próbuję to naprawić.
źródło
Masz tę samą ikonę
a ty powiadomienie
źródło
Na wypadek, gdyby ikona nie była ważna, możesz wymienić,
Do
To działa!
źródło
Miałem RemoteServiceException, gdy używanie Notification w mojej klasie rozszerza się z FirebaseMessagingService. Dodałem następujący kod do AndroidManifest.xml:
Również zasób ic_small ustawiony w instancji klasy Notification.Builder za pomocą metody setSmallIcon (ikona int).
źródło
W Android Studio w wersji 3.0.0 i nowszych podczas dodawania nowego obrazu do folderu drawables wybierz drawable zamiast drawable-v24.
Jeśli obraz, którego używasz, jest już a (v24), po prostu skopiuj go i wklej w tym samym katalogu (np. Drawables). Tym razem zapyta Cię, który zwykły czy v24 - po prostu upewnij się, że nie jest to v24 i spróbuj ponownie, to powinno naprawić błąd.
źródło
Ten sam problem wystąpił również ze mną i rozwiązałem to samo
POWÓD : Dzieje się tak, ponieważ używamy wektorów do rysowania dla RemoteViews i generowania wektorów do rysowania w czasie kompilacji. Nie jestem również pewien, dlaczego niektóre urządzenia nie są w stanie wykryć wygenerowanego identyfikatora zasobów do rysowania podczas uruchamiania aplikacji. Ale tak, to był powód.
REPRODUCE Kroki 1. Zainstaluj poprzednią kompilację. 2. Wyślij powiadomienie 3. Zaktualizuj kompilację za pomocą kodu następnej wersji 4. Po zaktualizowaniu aplikacji nie otwieraj aplikacji i nie wysyłaj powiadomienia ponownie
ROZWIĄZANIE Zastąp wektor do rysowania na normalny plik do rysowania (.png lub .jpg).
Mam nadzieję, że to rozwiązuje problem.
źródło
Jeśli masz powiadomienie widoczne, gdy Twoja aplikacja jest aktualizowana, możesz się z tym spotkać. Może być konieczne utworzenie odbiornika BroadcastReceiver, który czeka na wiadomość PACKAGE_CHANGED, po czym zamkniesz wszystkie usługi, które również odrzucą powiązane z nimi powiadomienia.
źródło
Miałem ten sam problem, gdy ustawiłem powiadomienie w pakiecie. Spróbowałem tego i rozwiązało to mój problem:
Upewnij się, że metoda setLargeIcon () została wywołana przed setSmallIcon ().
źródło
Ja też miałem ten sam problem. Problem dotyczy ikony, której używasz, używałem android.R.drawable.stat_sys_download. Przejdź do drawables.xml i wklej to.
a następnie w swoim kodzie
Możesz spróbować innego obrazu zamiast tego obrazu
źródło
Mój sposób na rozwiązanie tego problemu: miałem „złe” widoki w moim układzie (np. Pole wyboru) - więc je usunąłem.
Wydaje się, że RemoteViews obsługuje tylko obrazy i teksty (co potwierdza przeczytanie dokumentu).
źródło
Miałem RemoteServiceException podczas korzystania z android.support.constraint.ConstraintLayout. Zmień to na LinearLayout lub Relative, a także android: layout_height = "wrap_content" dla kontenera
źródło
(nie jest to rozwiązanie dla bieżącego pytania, ale pomaga komuś z podobnym podstawowym problemem). Ja też miałem ten sam problem, ale w moim przypadku użyłem uszkodzonego pliku .png, który powoduje ten sam problem. Więc usunąłem go i ponownie dołączyłem poprawny plik .png.
źródło
Zastąp
<android.support.v7.widget.AppCompatTextView
z<TextView
niestandardowego układu powiadomień.Ponieważ
android.support.v7.widget.AppCompatTextView
lubandroid.support.v7.widget.AppCompatImageView
działa tylko w czasie wykonywania.Więc użyj
TextView
lubImageView
źródło
Jeśli ktoś nadal boryka się z tym problemem: Dodaj plik png do folderu do rysowania o nazwie ic_stat_ic_notification (lub dowolną nazwą, którą lubisz)
aw swoim manifeście dodaj poniżej kilka wierszy
i możesz tutaj tworzyć swoje ikony -> https://romannurik.github.io/AndroidAssetStudio/icon
źródło
Zsynchronizuj projekt, a następnie Wyczyść go, Plik> Synchronizuj, a następnie: Kompiluj> Wyczyść projekt
Mam nadzieję, że to wam wszystkim pomoże, to praca dla mnie
źródło
Wystąpił ten błąd z powodu automatycznego łączenia i linków Opcje możliwe do kliknięcia w widoku tekstu w widoku powiadomień:
Bądź ostrożny!
źródło
To zadziałało dla mnie. Skomentuj odniesienie do ikony, aby móc bez problemów korzystać z NotificationCompat.Builder.
źródło