Como corrigir: android.app.RemoteServiceException: Notificação incorreta publicada no pacote *: Não foi possível criar o ícone: StatusBarIcon

127

Estou vendo a seguinte exceção nos logs de falha:

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)

Estou postando minha notificação de um IntentService de um conjunto PendingIntent por meio do AlarmManager usando o seguinte método. Todos os valores passados ​​aqui são dos extras do pacote configurável no 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());
}

Pelo que vi de outras respostas - a exceção que estou vendo acontece quando setSmallIcon()não é chamada corretamente.

Eu verifiquei e verifiquei se os IDs de recurso que estão sendo passados ​​estão todos corretos.

FishStix
fonte
3
Estou com o mesmo erro (relatórios de falha de um aplicativo ao vivo). Não consigo reproduzi-lo no meu dispositivo. Atualmente estou pensando que é porque as pessoas modificaram o .apk
escurecer
Gente, de que maneira eu posso resolver esse problema. Eu uso pngs, mas muito raramente aplicativo trava
user7856586

Respostas:

98

O que estava acontecendo era que eu estava incluindo a referência de número inteiro ao ícone no pacote PendingIntent, e esse número foi posteriormente referenciado ao ser postado no NotificationManager.

Entre a obtenção da referência inteira e a intenção pendente, o aplicativo foi atualizado e todas as referências desenháveis ​​foram alteradas. O número inteiro que costumava referenciar o drawable correto agora referenciava o drawable incorreto ou nenhum (nenhum - causando esta falha)

FishStix
fonte
8
Bizarro. Em outras palavras, isso não é corrigível, é? Estou vendo as mesmas falhas no meu aplicativo.
Matthias
Não parece corrigível. No futuro, terei que conceber uma maneira diferente de publicar notificações com imagens no futuro .... #
FishStix
E se tentarmos definir o textSize da exibição remota como ret.setInt (id, "setTextSize", 20); Também trava. Sei que também precisamos fornecer as unidades, mas como faço isso com essa assinatura de método. Algum ponteiro ??
precisa saber é
1
Poderia ser possível limpar a notificação e tudo relacionado quando o aplicativo é morto para ser atualizado? (Assumindo que faria o aplicativo evitar o problema)
NoHarmDan
3
Caso você deseje fazer referência a R.drawable.my_image, é mais seguro salvá-lo para agrupar como uma sequência ( bundle.putString("img", "my_image")e depois converter quando necessário para o inteiro @DrawableRes real da seguinte maneira:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
vanomart
52

VectorXmlSabe-se que o uso dentro da sua notificação causa esse problema. Use png's

Bubunyo Nyavor
fonte
4
Somente PNGs estavam sendo usados.
Fishstix
No meu caso, eu tinha vetor na drawablepasta e png em drawable-hdpi, xhdpietc. Mas não havia png para drawable-mdpi, e ele travou no dispositivo MDPI ao postar uma notificação.
Vadim Kotov
34

Não use SVG no Kitkat!

Eu sempre tive o mesmo problema quando queria mostrar uma notificação no Kitkat. O que causou o problema para mim é que eu defini todos os ícones em xml (de svg), o pequeno ícone e o ícone de ação também. Depois de substituí-los por png-s, o problema foi resolvido ao meu lado.

bendaf
fonte
4
Eu posso confirmar. Drawables de vetor em notificações causam RemoteServiceException no KitKat.
Khizhny Andrey 14/03
2
No caso de KitKat, o problema foi resolvido quando eu substituiu o XML com PNG em: nova NotificationCompat.Builder (contexto, CHANNEL_ID) .setSmallIcon (R.drawable.my_icon)
Andrew Glukhoff
1
Isso funcionou para mim. Eu estava correndo API 19 e usado um arquivo SVG para o ícone de notificação e estava me dando esse erro, até que eu mudei-o para um pequeno ícone png
WHOATEMYNOODLES
10

android.app.RemoteServiceException: Notificação incorreta publicada

Eu tive o mesmo problema, mas fui resolvido. Meu problema é "arquivo .xml" do modo de exibição remota.

No meu arquivo xml, fui adicionado um Viewentre o LinearLayoutdivisor for.

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

O Viewcomponente acima criando a exceção de notificação incorreta. Esse motivo de exceção é apenas um arquivo xml de exibições remotas.

Depois de remover esse componente View, meu código foi executado corretamente, sem nenhuma exceção. Por isso, senti que a gaveta do Notification não aceitava visualizações personalizadas.

Portanto, você não desenha nada como a exibição acima no arquivo .xml do RemoteViewobjeto.

Kona Suresh
fonte
9

Meu problema era que o ícone que eu estava usando no

.setSmallIcon(R.drawable.ic_stat_push_notif)

não foi gerado adequadamente. De acordo com o documento oficial :

Conforme descrito em Fornecendo conjuntos de ícones específicos da densidade e suportando várias telas, você deve criar ícones separados para todas as densidades de tela generalizadas, incluindo telas de baixa, média, alta e extra-alta densidade. Isso garante que seus ícones sejam exibidos corretamente em toda a gama de dispositivos nos quais seu aplicativo pode ser instalado.

Portanto, a melhor maneira de cumprir o exposto acima, usei o Notification Generator fornecido por Roman Nurik em https://romannurik.github.io/AndroidAssetStudio/index.html

Dessa forma, você pode usar uma imagem (levando em consideração que isso precisa ter um plano de fundo transparente) e permitir que o gerador faça o trabalho para gerar os diferentes tamanhos para os ícones de notificação.

O mais importante é que, se o gerador de ícones depois de navegar na imagem que você usar usar mostrar um círculo ou quadrado preenchido em branco, há problemas com a imagem, talvez porque ela não tenha transparências, verifique se você tem isso ok.

Carlos Daniel
fonte
2
No meu caso, eu tinha vetor na drawablepasta e png em drawable-hdpi, xhdpietc. Mas não havia png para drawable-mdpi, e ele travou no dispositivo MDPI ao postar uma notificação.
Vadim Kotov
7

No meu aplicativo, esse tipo de bug ocorre apenas durante a atualização. Se a identificação do recurso for alterada na versão mais recente, o Android RemoteViewpoderá não encontrar o recurso e jogar fora o RemoteServiceException. Se você publicar uma terceira versão e não alterar a identificação do recurso, os erros poderão desaparecer apenas temporariamente .

É possível reduzir esse tipo de erro editando res/values/public.xmle res/values/ids.xml. O compilador gerará uma identificação de recurso individual se a identificação de recurso não estiver em public.xmlou ids.xml. Quando você altera o nome do recurso ou adiciona novos recursos, o ID pode mudar e alguns dispositivos podem falhar em encontrá-lo.

Portanto, a etapa é a seguinte:

  1. Descompile o arquivo apk e res/valuesencontre o public.xmleids.xml
  2. Encontre todos os recursos relacionados ao RemoteView no seu aplicativo e copie-os (strings, dimen, drawable, layout, ID, cor ...)
  3. Criar public.xmle ids.xmlsob res/valuesem seu código-fonte e cole as linhas u acabou de copiar

Nota:

O Gradle 1.3.0 e superior ignoram o local public.xml. Para fazê-lo funcionar, você precisa adicionar algum script em seubuild.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 não suporta o projeto de submódulos. Estou tentando consertar isso.

thundertrick
fonte
3

Você passou no mesmo ícone

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

e você notificação

 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
fonte
2
Passei a imagem vetorial como um recurso e acho que causou falhas nos dispositivos oneplus / android 6. Não tenho certeza de 100%.
Alexey #
3

Caso o ícone não seja importante, você pode substituir,

R.drawable.your_icon

Para

android.R.drawable.some_standard_icon

Isso funciona!

Ashwin Balani
fonte
2

Eu tinha o RemoteServiceException quando o uso de Notificação na minha classe se estende do FirebaseMessagingService. Adicionei o seguinte código ao AndroidManifest.xml:

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

Também use o recurso ic_small definido na instância de uma classe Notification.Builder pelo método setSmallIcon (ícone int).

Вячеслав Бондаренко
fonte
esses metadados precisam ser adicionados dentro das tags <service </service>?
Andrey
2

No Android Studio versão 3.0.0 e superior, ao adicionar uma nova imagem na pasta drawables, escolha drawable em vez de drawable-v24.insira a descrição da imagem aqui

Se a imagem que você está usando já é uma (v24), basta copiá-la e colá-la no mesmo diretório (por exemplo: drawables). Desta vez, ele perguntará qual regular ou v24 - apenas certifique-se de que não é o v24 e tente novamente para corrigir o erro.

Haider Malik
fonte
Aviso - se você estiver na visualização "Android", mude para a visualização "Projeto". Em vista Android, você não pode ver o diretório drawables v24
Hatzil
2

O mesmo problema aconteceu comigo também e resolvi o mesmo

MOTIVO : Isso está acontecendo porque estamos usando o drawable vetorial para RemoteViews e o drawable vetorial gera drawable em tempo de compilação. Também não sei por que alguns dispositivos não conseguem detectar o ID dos recursos desenháveis ​​gerados enquanto atualizamos o aplicativo. Mas sim, esse foi o motivo.

REPRODUZIR Etapas 1. Instale a compilação anterior. 2. Envie uma notificação 3. Atualize a compilação com o código da próxima versão 4. Após atualizar o aplicativo, não abra o aplicativo e envie a notificação novamente

SOLUÇÃO Substitua o drawable vector pelo arquivo normal drawable (.png ou .jpg).

Espero que isso resolva o problema.

Gajju
fonte
1

Se você tem uma notificação visível enquanto o aplicativo é atualizado, você pode encontrar isso. O que você precisa fazer é criar um BroadcastReceiver que aguarde uma mensagem PACKAGE_CHANGED; nesse momento, você encerra todos os seus serviços, o que também dispensa as notificações associadas.

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

Eu tive o mesmo problema ao definir uma notificação em um pacote. Eu tentei isso e resolveu o meu problema:

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

Verifique se setLargeIcon () invocou antes de setSmallIcon ().

Geléia
fonte
4
Por que isso deve ajudar?
limitium 19/02
0

Eu também tive o mesmo problema. O problema está no ícone que você está usando, eu estava usando o android.R.drawable.stat_sys_download. Vá para drawables.xml e cole isso.

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

e depois no seu código

builder.setSmallIcon(R.drawable.ic_start_download);

Você pode tentar outra imagem em vez dessa imagem

karthik vishnu kumar
fonte
0

Minha maneira de resolver isso: eu tinha visualizações "ruins" no meu layout (por exemplo, uma caixa de seleção) - então as removi.

O RemoteViews parece suportar apenas imagens e textos (a ser confirmado com a leitura do documento).

Benjamin Piette
fonte
0

Eu tive RemoteServiceException ao usar android.support.constraint.ConstraintLayout. Altere para LinearLayout ou Relative e também android: layout_height = "wrap_content" para container

JustAndrew
fonte
0

(essa não é a solução para a pergunta atual, mas ajuda alguém com um problema central semelhante) Eu também tive o mesmo problema, mas no meu caso eu usei o arquivo .png corrompido que está causando o mesmo problema. Então, eu o apaguei e incluí novamente o arquivo .png correto.

RameshJanagama
fonte
0

Por favor, substitua <android.support.v7.widget.AppCompatTextViewcom <TextViewde layout de notificação personalizada.

Porque android.support.v7.widget.AppCompatTextViewou android.support.v7.widget.AppCompatImageViewsó funciona em tempo de execução.

Então use TextViewouImageView

Ahamadullah Saikat
fonte
0

Se alguém ainda estiver enfrentando esse problema: Adicione um arquivo png na sua pasta de desenho com o nome ic_stat_ic_notification (ou qualquer outro nome que você goste)

e no seu manifesto adicione abaixo algumas linhas

e você pode criar seus ícones por aqui -> https://romannurik.github.io/AndroidAssetStudio/icon

Jayapen Jose
fonte
0

Sincronize o projeto e, em seguida, Limpe-o, Arquivo> Sincronizar e depois: Construir> Limpar Projeto

Espero que ajude todos vocês, é trabalho para mim

o verdadeiro napster
fonte
0

Eu recebi este erro devido ao link automático e às opções de linksClickable no textview no modo de exibição de notificação:

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

Seja cuidadoso!

mestre
fonte
-3

Isso funcionou para mim. Comente a referência do ícone e, portanto, poderá usar o NotificationCompat.Builder sem problemas.

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