Negação de permissão: startForeground requer android.permission.FOREGROUND_SERVICE


193

Ultimamente, temos visto alguns dos seguintes rastreamentos de pilha. Por que poderia ser isso? Isso ocorre quando o aplicativo tenta mover um serviço de comentários de áudio para o primeiro plano com uma notificação de mídia e tudo.

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)

Respostas:


411

Isso acontecerá se você tiver definido targetSdkVersion = 28(Android 9 / Pie) ou superior e não tiver declarado o uso da FOREGROUND_SERVICEpermissão.

Nas notas de migração para o Android 9:

Agora, os aplicativos que desejam usar serviços em primeiro plano devem solicitar primeiro a permissão FOREGROUND_SERVICE. Como é uma permissão normal, o sistema concede automaticamente ao aplicativo solicitante. Iniciar um serviço em primeiro plano sem a permissão gera uma SecurityException.

A solução é apenas adicionar o seguinte em AndroidManifest.xml:

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

8
Isso significa que, se o número targetSdkVersionfor menor que 28, não precisamos de permissão para executar os serviços de primeiro plano em dispositivos com 28?

3
Isso soa como uma solução estranho para mim, para diminuir o targetSdkVersion
Denny

2
@Sjd Eles vão instalar muito bem. Não é como é maxSdkVersion.
Roy Solberg

9
Aumente a votação da sua resposta, mas as notas de versão não são uma desculpa para criar APIs não compatíveis com versões anteriores. Nesse caso, o Google poderia ter solicitado a um usuário permissão ou, pelo menos, fornecer uma dica em vez de travar o aplicativo silenciosamente. Ultimamente, o Android se torna muito difícil de manter.
Oleg Gryb

2
@miladsalimi Se você abrir o AndroidManifest.xml no Android Studio, poderá optar por ver o "manifesto mesclado". Talvez exista uma dependência que injete esse uso de permissão para você?
Roy Solberg

43

Negação de permissão: startForeground requer android.permission.FOREGROUND_SERVICE

Os aplicativos que segmentam o Android 9 (API nível 28) ou superior e usam serviços em primeiro plano devem solicitar o FOREGROUND_SERVICE permission.

Então agora precisamos adicionar a permissão do serviço Foreground no arquivo manifest

  • Permite que um aplicativo regular use Service.startForeground

AMOSTRA

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

FOREGROUND_SERVICE é uma permissão normal; portanto, o sistema a concede automaticamente ao aplicativo solicitante.

Verifique as notas de migração do Android 9 / Pie

  • mudança

Permissão de serviço em primeiro plano

  • Resumo

Agora, os aplicativos que desejam usar serviços em primeiro plano devem solicitar primeiro a permissão FOREGROUND_SERVICE. Como é uma permissão normal, o sistema concede automaticamente ao aplicativo solicitante. Iniciar um serviço em primeiro plano sem a permissão gera uma SecurityException.

Leia também startForeground()

  • Os aplicativos que segmentam a API Build.VERSION_CODES.Pou posterior devem solicitar a permissão Manifest.permission.FOREGROUND_SERVICEpara usar esta API.

Como o Oppo F11 Pro está funcionando, mas o aplicativo de telefone Samsung, Nokia e Mi está travado e tem o mesmo erro no log.pode me dizer o que eu faço para consertar?
Kapil soni

@Kapilsoni `obteve o mesmo erro no log` que erro você está recebendo
Nilesh Rathod

eu tenho esse erro "android.app.RemoteServiceException: Bad notificação para startForeground:"
Kapil soni

8

Para o nível 28 da API ou superior, é necessária a permissão FOREGROUND_SERVICE. Caso contrário, ele não pode ser executado e obteve uma exceção.

Isso será resolvido adicionando

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

no arquivo AndroidManifest.xml.


Eu adicionei, mas não corrigi, para mim
Kapil soni

@Kapilsoni mesmo problema para mim, adicionado, mas ainda trava devido à permissão insuficiente na API 29, você conseguiu resolvê-lo?
ArturM 5/04

4

A targetSdkVersionde pelo menos 28será obrigatória a partir de 1º de novembro de 2019 para atualizações de aplicativos na Play Store. Portanto, você precisará alterar a API de destino e solicitar a permissão FOREGROUND_SERVICEpara evitar a falha nostartForeground()


0

Observando que FOREGROUND_SERVICEnão requer requisito de permissão de tempo de execução. adicione apenas abaixo aos Manifestos

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

a linha acima deve ser adicionada antes <application

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.