A notificação do Android não está sendo exibida


115

Preciso de um programa que adicionará uma notificação no Android. E quando alguém clica na notificação, deve levá-lo à minha segunda atividade.

Eu estabeleci o código. A notificação deveria estar funcionando, mas por algum motivo não está funcionando. O Notificationnão está aparecendo. Eu não sei o que estou perdendo.

Código desses arquivos:

Notification n = new Notification.Builder(this)
        .setContentTitle("New mail from " + "test@gmail.com")
        .setContentText("Subject")
        .setContentIntent(pIntent).setAutoCancel(true)
        .setStyle(new Notification.BigTextStyle().bigText(longText))
        .build();

NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Hide the notification after it's selected

notificationManager.notify(0, n);

tente ser mais conciso ao fazer perguntas. Você deixa de mencionar o que não está funcionando. Na verdade, você nem menciona que algo não está funcionando. O Activitynão está sendo lançado? Não Notificationestá aparecendo?
slinden77

3
@dmmh eu disse na minha pergunta qual é o meu problema! E não achei nada de errado com a pergunta. Minha pergunta era específica sobre o problema. Se você não é especialista não precisa cutucar! E a resposta de tato469 foi boa.
Choudhury AM

3
Estou ressaltando que o objetivo deste site não é para você resolver seus problemas, mas para que outras pessoas também possam encontrar uma solução para eles. Eu não estou cutucando. Lamento ter magoado seus sentimentos, mas o fato é que sua pergunta estava errada, a resposta estava errada e todas essas informações enganosas levarão outros programadores novatos, que têm o mesmo problema que você descreve, a tentar soluções que não funcionam com base no código fornecido por VOCÊ. Em nenhum caso é relevante ou não se eu sou um especialista ou não. Principalmente porque estou certo, sua pergunta é vaga e a outra resposta está errada.
slinden77

Vou pedir para remover esta pergunta e a resposta, pois é enganosa. Tenha um bom dia.
slinden77

1
mudou a pergunta, para que as pessoas entendam qual é o problema.
Choudhury AM

Respostas:


412

O código não funciona sem um ícone. Portanto, adicione a setSmallIconchamada à cadeia de construtores assim para que funcione:

.setSmallIcon(R.drawable.icon)

Android Oreo (8.0) e superior

O Android 8 introduziu um novo requisito de configuração da channelIdpropriedade usando a NotificationChannel.

private NotificationManager mNotificationManager;

NotificationCompat.Builder mBuilder =
    new NotificationCompat.Builder(mContext.getApplicationContext(), "notify_001");
Intent ii = new Intent(mContext.getApplicationContext(), RootActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, ii, 0);

NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle();
bigText.bigText(verseurl);
bigText.setBigContentTitle("Today's Bible Verse");
bigText.setSummaryText("Text in detail");

mBuilder.setContentIntent(pendingIntent);
mBuilder.setSmallIcon(R.mipmap.ic_launcher_round);
mBuilder.setContentTitle("Your Title");
mBuilder.setContentText("Your text");
mBuilder.setPriority(Notification.PRIORITY_MAX);
mBuilder.setStyle(bigText);

mNotificationManager =
    (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

// === Removed some obsoletes
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
    String channelId = "Your_channel_id";
    NotificationChannel channel = new NotificationChannel(
                                        channelId,
                                        "Channel human readable title",
                                        NotificationManager.IMPORTANCE_HIGH);
   mNotificationManager.createNotificationChannel(channel);
  mBuilder.setChannelId(channelId);
}

mNotificationManager.notify(0, mBuilder.build());

Como obter CHANNEL_ID? por favor ajude
Ananta Prasad

@LAnantaPrasad CHANNEL_ID foi criado para ser um identificador para você. É o que você agrupa as notificações, como uma conversa de bate-papo ou bate-papo em grupo.
Casey Daniel

Obrigado, setChannelIdsão obrigatórios. Antes de adicionar isso, a notificação é exibida no meu dispositivo SONY, mas não no dispositivo SAMSUNG.
Wesely


2
Inclua também a verificação, if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }pois sem ela, a notificação não aparecerá, mesmo se a API do seu dispositivo> = 26.
Koushik Shom Choudhury

57

Na verdade, a resposta de ƒernando Valle não parece estar correta. Então, novamente, sua pergunta é muito vaga porque você não mencionou o que está errado ou não está funcionando.

Olhando para o seu código, estou assumindo que ele Notificationsimplesmente não está aparecendo.

Sua notificação não está sendo exibida porque você não forneceu um ícone. Mesmo que a documentação do SDK não mencione que ele é obrigatório, na verdade é muito e você Notificationnão aparecerá sem ele.

addActionsó está disponível a partir de 4.1. Antes disso, você usaria o PendingIntentpara iniciar um Activity. Você parece especificar a PendingIntent, então seu problema está em outro lugar. Logicamente, deve-se concluir que é o ícone que falta.


eu encontrei esse problema. Mas obrigado pela resposta adequada. Eu realmente aprecio sua ajuda.
Choudhury AM

1
Você disse que addAction só está disponível a partir da versão 4.1, mas está errado, usei na versão 2.3. O manual de referência fala sobre o botão, não sobre a notificação: "Os botões de ação não aparecerão em plataformas anteriores ao Android 4.1." você pode verificar aqui: AddAction está incluído em android.support.v4.app
ƒernando Valle

1
O OP está usando Notification.Builder, não NotificationCompat.Builder, como você está sugerindo. Só porque existe uma biblioteca de compatibilidade e ela pode ser usada, não significa que a função esteja disponível na API normal. O link que você fornece realmente estipula isso. Esta questão está claramente relacionada Notification.Builder, como mostra o exemplo. E a biblioteca de compatibilidade provavelmente só incluiu esta função após a versão 4.1 estar disponível. Sua resposta é enganosa, porque agora você sugere que ela está disponível desde 2.3.
slinden77

Desculpe se falei mal, quero dizer que é possível em 2.3
ƒernando Valle

4
Argh o ícone !! Nem percebi que estava faltando, mas adicioná-lo resolveu o problema. Não vi nada de útil no console sobre um ícone ausente, parece falhar silenciosamente.
Pete

33

Estava faltando o pequeno ícone. Eu cometi o mesmo erro e a etapa acima resolveu.

De acordo com a documentação oficial: Um objeto de Notificação deve conter o seguinte:

  1. Um pequeno ícone, definido por setSmallIcon ()

  2. Um título, definido por setContentTitle ()

  3. Texto detalhado, definido por setContentText ()

  4. No Android 8.0 (API de nível 26) e superior , um ID de canal de notificação válido, definido por setChannelId () ou fornecido no construtor NotificationCompat.Builder ao criar um canal.

Consulte http://developer.android.com/guide/topics/ui/notifiers/notifications.html


3
Isso não é verdade. Se você usar um layout de notificação personalizado usando setContent, nenhum título ou texto será necessário.
Ray Li,

11

Isso me enganou hoje, mas percebi que era porque no Android 9.0 (Pie), o Do Not Disturb por padrão também oculta todas as notificações, em vez de apenas silenciá-las como no Android 8.1 (Oreo) e antes. Isso não se aplica a notificações.

Eu gosto de ter DND ativado para meu dispositivo de desenvolvimento, então ir para as configurações DND e alterar a configuração para simplesmente silenciar as notificações (mas não ocultá-las) corrigiu para mim.


9

A criação de canais de notificação é obrigatória para versões do Android posteriores ao Android 8.1 (Oreo) para tornar as notificações visíveis. Se as notificações não estiverem visíveis em seu aplicativo para Androids Oreo +, você precisará chamar a seguinte função quando seu aplicativo for iniciado -

private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name,
       importance);
        channel.setDescription(description);
        // Register the channel with the system; you can't change the importance
        // or other notification behaviours after this
        NotificationManager notificationManager =
        getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
   }
}

1

Eu acho que você esquece o

addAction(int icon, CharSequence title, PendingIntent intent)

Veja aqui: Adicionar Ação


1
o método addAction()não está disponível em Notification.Builder.
slinden77

1
Ele existe, mas está obsoleto. Em vez disso, você pode passar uma Actioninstância com a qual pode criar Notification.Action.Builder. PS, Sempre use a alternativa Compat (ou seja, NotificationCompat), uma vez que o Google tende a corrigir bugs e fornecer melhor compatibilidade com eles
Gökhan Barış Aker

Se você não quiser especificar nenhuma ação, basta usar .setContentIntent(null)com o construtor.
Gökhan Barış Aker

1

Eu tive o mesmo problema com meu aplicativo Android. Eu estava testando as notificações e descobri que elas estavam aparecendo no meu emulador de Android, que rodava um sistema Android 7.0 (Nougat), enquanto não estava rodando no meu telefone, que tinha Android 8.1 (Oreo).

Depois de ler a documentação, descobri que o Android tinha um recurso chamado canal de notificação, sem o qual as notificações não apareceriam nos dispositivos Oreo. Abaixo está o link para a documentação oficial do Android nos canais de notificação.


1

Para mim, era um problema com deviceToken. Verifique se o token do dispositivo receptor e remetente está devidamente atualizado em seu banco de dados ou onde quer que você o esteja acessando para enviar notificações.

Por exemplo, use o seguinte para atualizar o token do dispositivo na inicialização do aplicativo. Portanto, ele será sempre atualizado corretamente.

// Device token for push notifications
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
  new OnSuccessListener<InstanceIdResult>() {

    @Override
    public void onSuccess(InstanceIdResult instanceIdResult) {

        deviceToken = instanceIdResult.getToken();

        // Insert device token into Firebase database
        fbDbRefRoot.child("user_detail_profile").child(currentUserId).child("device_token")).setValue(deviceToken)
                .addOnSuccessListener(
                  new OnSuccessListener<Void>() {

                    @Override
                    public void onSuccess(Void aVoid) {

                    }
                });
    }
});

Onde isso é deviceTokendeclarado?
Peter Mortensen de

Por que está onSuccessvazio?
Peter Mortensen de

@PeterMortensen .. com sucesso, você pode fazer tudo o que sua lógica permitir, como iniciar uma nova intenção, brindar ou permanecer na mesma página. Quanto à declaração deviceToken, você pode declará-la como Private String deviceToken antes de onCreate em sua página
DragonFire

(Para deixar meu próprio comentário mais claro: há dois onSuccesss - eu estava me referindo ao interno (que está vazio))
Peter Mortensen

1

Você também precisa alterar o arquivo build.gradle e adicionar a versão do Android SDK usada nele:

implementation 'com.android.support:appcompat-v7:28.0.0'

Isso funcionou como um encanto no meu caso.


0

As notificações podem não ser mostradas se você mostrar as notificações rapidamente uma após a outra ou cancelar uma existente e, em seguida, mostrá-la novamente (por exemplo, para acionar uma notificação de alerta para notificar o usuário sobre uma alteração em uma notificação em andamento). Nesses casos, o sistema pode decidir apenas bloquear a notificação quando achar que ela pode se tornar muito opressiva / com spam para o usuário.

Observe que, pelo menos no Android padrão (testado com 10) de fora, esse comportamento parece um pouco aleatório: às vezes acontece e às vezes não. Meu palpite é que há um limite de tempo muito curto durante o qual você não tem permissão para enviar muitas notificações. Às vezes, chamar NotificationManager.cancel()e então NotificationManager.notify()pode causar esse comportamento.

Se você tiver a opção, ao atualizar uma notificação, não a cancele antes, apenas ligue NotificationManager.notify()com a notificação atualizada. Isso não parece desencadear o bloqueio acima mencionado pelo sistema.


-1

Se você estiver na versão> = Android 8.1 (Oreo) enquanto usa um canal de notificação, defina sua importância como alta:

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);

1
O que você quer dizer com "uma versão> =" ? Você quer dizer "na versão 8.1 (ou superior)" ? Responda editando sua resposta , não aqui nos comentários (conforme apropriado).
Peter Mortensen,

@PeterMortensen me perdoe por isso foi apenas um tipo de agradecimento por me corrigir
Faisal Naseer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.