Depois de atualizar meu telefone para a Visualização do desenvolvedor 8.1, meu serviço em segundo plano não é mais iniciado corretamente.
No meu serviço de longa duração, implementei um método startForeground para iniciar a notificação em andamento, chamada ao criar.
@TargetApi(Build.VERSION_CODES.O)
private fun startForeground() {
// Safe call, handled by compat lib.
val notificationBuilder = NotificationCompat.Builder(this, DEFAULT_CHANNEL_ID)
val notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.build()
startForeground(101, notification)
}
Mensagem de erro:
11-28 11:47:53.349 24704-24704/$PACKAGE_NAMEE/AndroidRuntime: FATAL EXCEPTION: main
Process: $PACKAGE_NAME, PID: 24704
android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=My channel pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x42 color=0x00000000 vis=PRIVATE)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1768)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
canal inválido para notificação de serviço , aparentemente meu canal antigo, o DEFAULT_CHANNEL_ID, não é mais apropriado para a API 27, presumo. Qual seria o canal adequado? Eu tentei olhar através da documentação
Respostas:
Depois de algum tempo mexendo com soluções diferentes, descobri que é preciso criar um canal de notificação no Android 8.1 e superior.
Pelo que entendi, os serviços em segundo plano agora são exibidos como notificações normais que o usuário pode selecionar para não exibir, desmarcando o canal de notificação.
Atualização : Também não esqueça de adicionar a permissão de primeiro plano, conforme necessário, o Android P:
fonte
IMPORTANCE_DEFAULT
vez deIMPORTANCE_NONE
?Solução Java (Android 9.0, API 28)
Na sua
Service
turma, adicione isto:ATUALIZAÇÃO: ANDROID 9.0 PIE (API 28)
Adicione esta permissão ao seu
AndroidManifest.xml
arquivo:fonte
A primeira resposta é ótima apenas para quem conhece o kotlin, para quem ainda usa java aqui eu traduzo a primeira resposta
Para o Android, P não se esqueça de incluir esta permissão
fonte
Funciona corretamente no Andorid 8.1:
Amostra atualizada (sem nenhum código obsoleto):
Recortado antigo (é um aplicativo diferente - não relacionado ao código acima):
fonte
Notification.Builder(getApplicationContext()).setChannelId(CHANNEL_ONE_ID)...
paraNotification.Builder(getApplicationContext(), CHANNEL_ONE_ID)...
PRIORITY_MAX
que o que é melhor usar?No meu caso, é porque tentamos postar uma notificação sem especificar
NotificationChannel
:O melhor lugar para colocar o código acima é no
onCreate()
método daApplication
classe, de modo que precisamos declará-lo de uma vez por todas:Depois de configurá-lo, podemos usar a notificação com o
channelId
que acabamos de especificar:Em seguida, podemos usá-lo para postar uma notificação:
Se você deseja usá-lo como notificação do serviço em primeiro plano:
fonte
Graças a @CopsOnRoad, sua solução foi uma grande ajuda, mas funciona apenas para o SDK 26 e superior. Meu aplicativo tem como alvo 24 e superior.
Para evitar que o Android Studio se queixe, você precisa de um condicional diretamente em torno da notificação. Não é inteligente o suficiente saber que o código está em um método condicional ao VERSION_CODE.O.
fonte
Isso funcionou para mim. Na minha classe de serviço, criei o canal de notificação para o Android 8.1, conforme abaixo:
Nota: Crie o canal em que você está criando a Notificação para
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
fonte
Aqui está a minha solução
Espero que ajude :)
fonte