Después de actualizar mi teléfono a 8.1 Developer Preview, mi servicio en segundo plano ya no se inicia correctamente.
En mi servicio de larga ejecución, he implementado un método startForeground para iniciar la notificación en curso que se llama al crear.
@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)
}
Mensaje de error:
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 no válido para notificación de servicio , aparentemente mi canal anterior, el DEFAULT_CHANNEL_ID, ya no es apropiado para API 27, supongo. ¿Cuál sería el canal adecuado? He intentado revisar la documentación.
Respuestas:
Después de algunos retoques por un tiempo con diferentes soluciones, descubrí que uno debe crear un canal de notificación en Android 8.1 y superior.
Según tengo entendido, los servicios en segundo plano ahora se muestran como notificaciones normales que el usuario puede seleccionar para no mostrar anulando la selección del canal de notificación.
Actualización : Tampoco olvides agregar el permiso de primer plano según sea necesario Android P:
fuente
IMPORTANCE_DEFAULT
lugar deIMPORTANCE_NONE
?Solución Java (Android 9.0, API 28)
En tu
Service
clase, agrega esto:ACTUALIZACIÓN: ANDROID 9.0 PIE (API 28)
Agregue este permiso a su
AndroidManifest.xml
archivo:fuente
La primera respuesta es excelente solo para aquellas personas que conocen kotlin, para aquellos que todavía usan Java aquí traduzco la primera respuesta
Para Android, P no olvide incluir este permiso
fuente
Funciona correctamente en Andorid 8.1:
Muestra actualizada (sin ningún código obsoleto):
Viejo cortado (es una aplicación diferente, no relacionada con el código anterior):
fuente
Notification.Builder(getApplicationContext()).setChannelId(CHANNEL_ONE_ID)...
aNotification.Builder(getApplicationContext(), CHANNEL_ONE_ID)...
PRIORITY_MAX
qué es mejor usar?En mi caso, es porque intentamos publicar una notificación sin especificar lo siguiente
NotificationChannel
:El mejor lugar para poner el código anterior es el
onCreate()
método en laApplication
clase, por lo que solo tenemos que declararlo de una vez por todas:Después de configurar esto, podemos usar la notificación
channelId
que acabamos de especificar:Luego, podemos usarlo para publicar una notificación:
Si desea utilizarlo como notificación de servicio en primer plano:
fuente
Gracias a @CopsOnRoad, su solución fue de gran ayuda pero solo funciona para SDK 26 y superior. Mi aplicación apunta a 24 y superior.
Para evitar que Android Studio se queje, necesita un condicional directamente alrededor de la notificación. No es lo suficientemente inteligente como para saber que el código está en un método condicional a VERSION_CODE.O.
fuente
Esto funcionó para mí. En mi clase de servicio, creé el canal de notificación para Android 8.1 de la siguiente manera:
Nota: Cree el canal donde está creando la Notificación para
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
fuente
Aqui esta mi solucion
Espero que ayude :)
fuente