Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

614
Views
Obtener android.app.ForegroundServiceStartNotAllowedException en Android 12 (SDK 31)

Actualicé mis aplicaciones targetSdkVersion y compileSdkVersion a SDK 31 y comencé a recibir el siguiente bloqueo en la aplicación en un servicio que actualiza el widget en segundo plano.

 java.lang.RuntimeException: at android.app.ActivityThread.handleReceiver (ActivityThread.java:4321) at android.app.ActivityThread.access$1600 (ActivityThread.java:247) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2068) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loopOnce (Looper.java:201) at android.os.Looper.loop (Looper.java:288) at android.app.ActivityThread.main (ActivityThread.java:7842) at java.lang.reflect.Method.invoke (Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1003) Caused by: android.app.ForegroundServiceStartNotAllowedException: at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel (ForegroundServiceStartNotAllowedException.java:54) at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel (ForegroundServiceStartNotAllowedException.java:50) at android.os.Parcel.readParcelable (Parcel.java:3333) at android.os.Parcel.createExceptionOrNull (Parcel.java:2420) at android.os.Parcel.createException (Parcel.java:2409) at android.os.Parcel.readException (Parcel.java:2392) at android.os.Parcel.readException (Parcel.java:2334) at android.app.IActivityManager$Stub$Proxy.startService (IActivityManager.java:5971) at android.app.ContextImpl.startServiceCommon (ContextImpl.java:1847) at android.app.ContextImpl.startForegroundService (ContextImpl.java:1823) at android.content.ContextWrapper.startForegroundService (ContextWrapper.java:779) at android.content.ContextWrapper.startForegroundService (ContextWrapper.java:779) at com.mypackage.appname.ui.widget.widget_package.WidgetClassName.onUpdate (WidgetClassName.java:48) at android.appwidget.AppWidgetProvider.onReceive (AppWidgetProvider.java:66) at com.mypackage.appname.ui.widget.widget_package.WidgetClassName.onReceive (WidgetClassName.java) at android.app.ActivityThread.handleReceiver (ActivityThread.java:4312) at android.app.ActivityThread.access$1600 (ActivityThread.java:247) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2068) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loopOnce (Looper.java:201) at android.os.Looper.loop (Looper.java:288) at android.app.ActivityThread.main (ActivityThread.java:7842) at java.lang.reflect.Method.invoke (Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1003) Caused by: android.os.RemoteException: at com.android.server.am.ActiveServices.startServiceLocked (ActiveServices.java:691) at com.android.server.am.ActiveServices.startServiceLocked (ActiveServices.java:616) at com.android.server.am.ActivityManagerService.startService (ActivityManagerService.java:11839) at android.app.IActivityManager$Stub.onTransact (IActivityManager.java:2519) at com.android.server.am.ActivityManagerService.onTransact (ActivityManagerService.java:2498)

Además, si está utilizando algo como Firebase Crashlytics, su stacktrace debe ser algo como esto ->

 Caused by android.app.ForegroundServiceStartNotAllowedException: startForegroundService() not allowed due to mAllowStartForeground false: service com.mypackage.appname/.ui.widget.widget_package.MyForegroundServiceName at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel(ForegroundServiceStartNotAllowedException.java:54) at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel(ForegroundServiceStartNotAllowedException.java:50) at android.os.Parcel.readParcelable(Parcel.java:3333) at android.os.Parcel.createExceptionOrNull(Parcel.java:2420) at android.os.Parcel.createException(Parcel.java:2409) at android.os.Parcel.readException(Parcel.java:2392) at android.os.Parcel.readException(Parcel.java:2334) at android.app.IActivityManager$Stub$Proxy.startService(IActivityManager.java:5971) at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1847) at android.app.ContextImpl.startForegroundService(ContextImpl.java:1823) at android.content.ContextWrapper.startForegroundService(ContextWrapper.java:779) at android.content.ContextWrapper.startForegroundService(ContextWrapper.java:779) at com.mypackage.appname.ui.widget.widget_package.WidgetClassName.onUpdate(WidgetClassName.java:48) at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:66) at com.mypackage.appname.ui.widget.widget_package.WidgetClassName.onReceive(WidgetClassName.java) at android.app.ActivityThread.handleReceiver(ActivityThread.java:4312) at android.app.ActivityThread.access$1600(ActivityThread.java:247) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2068) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7842) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

Estoy agregando la forma de reproducir este problema y solucionarlo, porque no encontré ninguna documentación sobre esto en StackOverflow cuando lo busqué.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Cómo reproducir el accidente

Paso 1. Actualice su targetSdkVersion y compileSdkVersion a SDK 31.

Paso 2. Intente ejecutar cualquier servicio en primer plano cuando su aplicación esté en segundo plano. En mi caso, se llamó al método onUpdate del widget después de la hora updatePeriodMillis , lo que iniciará un servicio Foreground, que actualiza los datos al obtener la información adecuada de Internet.

Recuerde : los límites de ejecución en segundo plano agregados en Android 8.0 no tienen nada que ver con este problema. Esta limitación/excepción se agregó en Android 12/SDK 31 - Fuente .


¿Qué es esta excepción y por qué se agregó?

Las aplicaciones destinadas a Android 12 (nivel de API 31) o superior no pueden iniciar servicios en primer plano mientras se ejecutan en segundo plano, excepto en algunos casos especiales. Si una aplicación intenta iniciar un servicio en primer plano mientras se ejecuta en segundo plano y el servicio en primer plano no satisface uno de los casos excepcionales, el sistema genera una excepción ForegroundServiceStartNotAllowedException .

Estos casos especiales son:

  • Su aplicación pasa de un estado visible al usuario, como una actividad.

  • Su aplicación puede iniciar una actividad desde el fondo, excepto en el caso de que la aplicación tenga una actividad en la pila de actividades de una tarea existente.

  • Su aplicación recibe un mensaje de alta prioridad mediante Firebase Cloud Messaging.

  • El usuario realiza una acción en un elemento de la interfaz de usuario relacionado con su aplicación. Por ejemplo, pueden interactuar con una burbuja, notificación, widget o actividad.

  • Su aplicación invoca una alarma exacta para completar una acción que solicita el usuario.

  • Su aplicación es el método de entrada actual del dispositivo.

  • Su aplicación recibe un evento relacionado con la transición del reconocimiento de actividad o geoperimetraje.

  • Después de que el dispositivo se reinicia y recibe la acción de intención ACTION_BOOT_COMPLETED, ACTION_LOCKED_BOOT_COMPLETED o ACTION_MY_PACKAGE_REPLACED en un receptor de transmisión.

  • Tu aplicación recibe la acción de intención ACTION_TIMEZONE_CHANGED, ACTION_TIME_CHANGED o ACTION_LOCALE_CHANGED en un receptor de transmisión.

  • Su aplicación recibe una transmisión de Bluetooth que requiere los permisos BLUETOOTH_CONNECT o BLUETOOTH_SCAN.

  • Aplicaciones con determinadas funciones o permisos del sistema, como propietarios de dispositivos y propietarios de perfiles.

  • Su aplicación utiliza Companion Device Manager y declara el permiso REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND o REQUEST_COMPANION_RUN_IN_BACKGROUND. Siempre que sea posible, utilice REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND.

  • El usuario desactiva las optimizaciones de batería para su aplicación. Puede ayudar a los usuarios a encontrar esta opción enviándolos a la página de información de la aplicación de su aplicación en la configuración del sistema. Para hacerlo, invoque una intención que contenga la acción de intención ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS.


Soluciones posibles

Solución 1

Esto funcionará durante un tiempo en Play Store hasta que Google haga obligatorio actualizar al nivel de API 31.

Actualmente, a partir de noviembre de 2021, todas las aplicaciones deben tener como objetivo el nivel de API 30 y superior. Entonces, si está utilizando el nivel 31 de API para su aplicación, la degradación de su compileSdkVersion y targetSdkVersion al nivel 30 de API debería solucionar el problema (al menos por un tiempo).

Solución 2

Para trabajos urgentes

Si estaba utilizando el servicio de primer plano para realizar un trabajo que es sensible al tiempo, inicie los servicios de primer plano dentro de una alarma exacta. Consulte más sobre esto en la documentación aquí -> Configure una alarma exacta .

Para trabajos urgentes/acelerados

Esta es la solución que terminé usando para mi aplicación. Use WorkManager para programar e iniciar el trabajo en segundo plano. Consulte más sobre esto en la documentación aquí -> Programar trabajo acelerado .

Puede saber más sobre WorkManager aquí -> WorkManager

Muestras de Github Repo para WorkManager -> Muestras de WorkManager

Agregué esta respuesta específicamente porque la búsqueda de esta excepción no muestra ningún recurso para saber por qué el servicio se comporta de manera diferente en Android 12. Todo esto está presente en la documentación de Google, y siempre recuerde verificar los cambios de comportamiento en el documento.

Todo lo relacionado con este cambio se puede encontrar aquí -> Cambios de comportamiento de Android 12 , específicamente dentro de las restricciones de lanzamiento de Foreground Service .

over 4 years ago · Santiago Trujillo Report

0

Si su aplicación es un MediaPlayer (es decir, utiliza un MediaBrowseService ) y está experimentando el bloqueo de ForegroundServiceStartNotAllowedException , es posible que deba:

  1. Actualice su Manifiesto para especificar que su servicio es para la reproducción de medios usando android:foregroundServiceType="mediaPlayback" en la declaración del Service

  2. Incluya el parámetro ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK en su llamada al método Serivce.startForeground

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!