Denegación de permisos: startForeground requiere android.permission.FOREGROUND_SERVICE

193

Últimamente hemos estado viendo algunos de los siguientes rastros de pila. ¿Por qué podría ser eso? Esto es cuando la aplicación intenta mover un servicio de comentarios de audio al primer plano con una notificación de medios y todo.

java.lang.SecurityException: Permission Denial: startForeground from pid=1824, uid=10479 requires android.permission.FOREGROUND_SERVICE
    at android.os.Parcel.createException(Parcel.java:1942)
    at android.os.Parcel.readException(Parcel.java:1910)
    at android.os.Parcel.readException(Parcel.java:1860)
    at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:5198)
    at android.app.Service.startForeground(Service.java:695)
    at com.example.app.services.AudioService.setUpMediaNotification(AudioService.java:372)
    at com.example.app.services.AudioService.setUpAndStartAudioFeed(AudioService.java:328)
    at com.example.app.services.AudioService.onStartCommand(AudioService.java:228)
    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3667)
    at android.app.ActivityThread.access$1600(ActivityThread.java:199)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: android.os.RemoteException: Remote stack trace:
    at com.android.server.am.ActivityManagerService.enforcePermission(ActivityManagerService.java:9186)
    at com.android.server.am.ActiveServices.setServiceForegroundInnerLocked(ActiveServices.java:1189)
    at com.android.server.am.ActiveServices.setServiceForegroundLocked(ActiveServices.java:870)
    at com.android.server.am.ActivityManagerService.setServiceForeground(ActivityManagerService.java:20434)
    at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:976)
Roy Solberg
fuente

Respuestas:

411

Esto sucederá si ha configurado targetSdkVersion = 28(Android 9 / Pie) o superior y no ha declarado el uso del FOREGROUND_SERVICEpermiso.

De las notas de migración para Android 9:

Las aplicaciones que deseen utilizar servicios en primer plano ahora deben solicitar primero el permiso FOREGROUND_SERVICE. Este es un permiso normal, por lo que el sistema lo otorga automáticamente a la aplicación solicitante. Iniciar un servicio en primer plano sin el permiso arroja una excepción de seguridad.

La solución es simplemente agregar lo siguiente en AndroidManifest.xml:

<manifest ...>
     ...
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>
Roy Solberg
fuente
8
¿Eso significa que si nuestro valor targetSdkVersiones inferior a 28, no necesitamos ningún permiso para ejecutar los servicios de primer plano en dispositivos que ejecutan 28?
3
Eso suena como una solución extraña para mí, para reducir el objetivoSdkVersion
Denny
2
@Sjd Se instalarán bien. No es como es maxSdkVersion.
Roy Solberg
9
Votar su respuesta, pero las notas de la versión no son una excusa para crear API no compatibles con versiones anteriores. En este caso, Google podría haber pedido a un usuario que otorgue permiso o al menos proporcione una pista en lugar de bloquear la aplicación en silencio. Android se vuelve muy difícil de mantener últimamente.
Oleg Gryb
2
@miladsalimi Si abre AndroidManifest.xml en Android Studio, puede elegir ver el "manifiesto combinado". ¿Tal vez hay una dependencia que inyecta ese uso de permisos para usted?
Roy Solberg
43

Denegación de permisos: startForeground requiere android.permission.FOREGROUND_SERVICE

Las aplicaciones que se dirigen a Android 9 (nivel de API 28) o superior y utilizan servicios en primer plano deben solicitar el FOREGROUND_SERVICE permission.

Así que ahora necesitamos agregar el permiso del servicio en primer plano en el archivo de manifiesto

  • Permite usar una aplicación regular Service.startForeground

MUESTRA

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

FOREGROUND_SERVICE es un permiso normal, por lo que el sistema lo otorga automáticamente a la aplicación solicitante.

Mira esto las notas de migración de Android 9 / Pie

  • Cambio

Permiso de servicio en primer plano

  • Resumen

Las aplicaciones que deseen utilizar servicios en primer plano ahora deben solicitar primero el permiso FOREGROUND_SERVICE. Este es un permiso normal, por lo que el sistema lo otorga automáticamente a la aplicación solicitante. Iniciar un servicio en primer plano sin el permiso arroja una excepción de seguridad.

Lea también startForeground()

  • Las aplicaciones dirigidas a API Build.VERSION_CODES.Po posterior deben solicitar el permiso Manifest.permission.FOREGROUND_SERVICEpara usar esta API.
Nilesh Rathod
fuente
señor, probé su solución, pero no funciona para mí para todos los dispositivos Android. Al igual que en Oppo F11 Pro, funciona pero en la aplicación de teléfono Samsung, Nokia y Mi se bloquea y aparece el mismo error en el registro. ¿Puede decirme qué hago para ¿reparar?
Kapil soni
@Kapilsoni `tiene el mismo error en el registro` qué error está recibiendo
Nilesh Rathod
recibí este error "android.app.RemoteServiceException: notificación incorrecta para startForeground:"
Kapil soni
8

Para el nivel de API 28 o superior, requiere el permiso FOREGROUND_SERVICE. De lo contrario, no se puede ejecutar y tiene una excepción.

Se resolverá agregando

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

en el archivo AndroidManifest.xml.

Zaman
fuente
he agregado pero no lo arreglé para mí
Kapil soni
@Kapilsoni mismo problema para mí, agregado pero todavía se bloquea debido a un permiso insuficiente en API 29, ¿logró resolverlo?
ArturM
4

Al targetSdkVersionmenos 28, será obligatorio a partir del 1 de noviembre de 2019 para las actualizaciones de aplicaciones en Play Store. Por lo tanto, deberá cambiar la API de destino y luego solicitar el permiso FOREGROUND_SERVICEpara evitar el bloqueo enstartForeground()

Hermano Mclintock
fuente
0

Teniendo en cuenta que FOREGROUND_SERVICEno requiere un requisito de permiso de tiempo de ejecución. solo agregue a continuación a Manifiestos

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

la línea anterior debe agregarse antes <application

Atef Farouk
fuente