servicio - service intent android
DenegaciĆ³n de permiso: startForeground requiere android.permission.FOREGROUND_SERVICE (2)
Últimamente hemos estado viendo algunas de las siguientes trazas de pila. ¿Por qué podría ser eso? Esto es de 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)
Denegación de permiso: startForeground requiere android.permission.FOREGROUND_SERVICE
Las aplicaciones que se dirigen a Android 9 (nivel API 28) o superior y usan servicios de primer plano deben solicitar el
FOREGROUND_SERVICE permission
.
Así que ahora necesitamos agregar el permiso de servicio de primer plano en el archivo de manifiesto
-
Permite que una aplicación regular use
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.
Consulta las notas de migración de Android 9 / Pie.
- Cambio
Permiso de servicio en primer plano
- Resumen
Las aplicaciones que deseen utilizar los servicios de 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. Al iniciar un servicio en primer plano sin el permiso se produce una excepción SecurityException.
También lea
startForeground()
-
Las aplicaciones dirigidas a la API
Build.VERSION_CODES.P
o posterior deben solicitar el permisoManifest.permission.FOREGROUND_SERVICE
para poder utilizar esta API.
Esto es lo que obtienes por no leer las notas de publicación correctamente.
Esto comenzó a suceder al configurar
targetSdkVersion = 28
(Android 9 / Pie) y se indica claramente en, por ejemplo,
las notas de migración
:
Las aplicaciones que deseen utilizar los servicios de 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. Al iniciar un servicio en primer plano sin el permiso se produce una excepción SecurityException.
Entonces,
la solución es simplemente agregar lo siguiente en
AndroidManifest.xml
:
<manifest ...>
...
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
...
<application ...>
...
</manifest>