Como solicitar permissões de um serviço no Android Marshmallow

101

No Android Marshmallow, as permissões devem ser solicitadas no tempo de execução quando são necessárias, em vez de todas de uma vez quando um aplicativo é instalado. No entanto, só consigo solicitar permissões de uma atividade, o que é um problema, pois meu aplicativo contém apenas serviços. (Por que isso, você pode perguntar? O app tem um mostrador de relógio Android Wear incorporado e tudo o que o telefone faz é procurar fotos próximas para enviar para o relógio - nenhuma atividade necessária. Mas requer permissões de localização.)

Então, existe alguma maneira de solicitar permissões de um serviço? Ou de alguma forma forçar as permissões a serem concedidas no momento da instalação como no passado?

Tony Wickham
fonte
este problema também dentro da classe de aplicativo
itzhar
Tente isso pode ser work stackoverflow.com/a/41221852/5488468
Bipin Bharti
Minha biblioteca para lidar com permissões de tempo de execução facilmente de qualquer contexto e também lida com "Não pergunte novamente". github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

Respostas:

47

requestPermission()só pode ser chamado de um Activitye não de um Service(ao contrário de checkPermission()que apenas requer PackageManager). Portanto, você precisa fazer algum trabalho extra para contornar isso; você precisa fornecer um Activityem seu aplicativo e, por exemplo, Servicepode verificar as permissões de que precisa e, se ainda não foram concedidas, pode criar uma notificação e informar o usuário com uma mensagem curta descritiva do motivo de haver uma notificação e o que precisa acontecer quando eles clicam na notificação, etc.

Ali Naddaf
fonte
Essa é a solução que Benjamin Poiesz propôs. Você pode ouvir este podcast das 23:40
xiaomi
Você também pode chamar requestPermission () dentro do fragmento.
Misagh Emamverdi
3
Qual é a solução para o caso de um serviço em segundo plano em execução verificando periodicamente se há atualizações de localização e eu apenas desabilito a permissão de localização nas configurações. Como não há atividade, isso faz com que meu serviço trave quando eu reabra o aplicativo
stud91
1
@ stud91 No mínimo, capture exceções de segurança ou permissões de consulta sempre que solicitar atualizações de localização. Isso evitará que seu aplicativo falhe (embora você não obtenha nenhum local se a permissão tiver sido revogada). Melhor ainda: verifique se há permissão e, se estiver faltando, exiba uma notificação que leva o usuário a uma atividade que é apenas um espaço reservado para a caixa de diálogo de permissões.
user149408
8
Aqui está como eu resolvi: github.com/mvglasow/satstat/blob/master/src/com/vonglasow/… Ele pode ser chamado de qualquer um Contextque também implemente OnRequestPermissionsResultCallback. A funcionalidade é semelhante ao padrão requestPermission().
user149408
15

Eu concordo, isso é muito problemático para os serviços, acho que você deveria relatar um problema na página Android Developer Preview para isso.

No momento, acho que a melhor solução é verificar a permissão no serviço e mostrar uma notificação se a permissão estiver faltando. Melhor ainda, crie uma DialogActivity para solicitar permissão quando os usuários pressionam a notificação.

Derek Fung
fonte
7

Dê uma olhada na biblioteca PermissionEverywhere . Ele permite que você solicite permissão de qualquer contexto.

Ele cria uma notificação clicando na qual abre uma atividade pedindo uma permissão.

Amostra de código da página github da biblioteca: -

@Override
  protected Boolean doInBackground(Void... params) {
      PermissionResponse response = PermissionEverywhere.getPermission(getApplicationContext(), 
      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
              REQ_CODE,
              "Notification title", 
              "This app needs  a write permission", 
              R.mipmap.ic_launcher)
              .call();
      //waits..
      boolean isGranted = response.isGranted();

      if(isGranted){ //changed from isGrante to isGranted
      // Do stuff
      }
  }
Heisenberg
fonte
1
Tentei a versão assíncrona em um serviço e não funcionou. onComplete nunca foi chamado
Leo Droidcoder
Boa ideia, mas não está disponível no repositório
naXa 02/10/2016
2
Este pacote funcionou para mim, obrigado pela sugestão. Eu observaria, porém, que não tentei a versão assíncrona. Além disso, para aqueles que estão tendo problemas para usar PermissionEverywhere, certifique-se de declarar a atividade auxiliar em seu manifesto E certifique-se de que, ao declará-la, ela esteja vinculada ao pacote correto (se estiver usando PermissionEverywherecomo um pacote separado). Levei muito tempo para perceber que não estava realmente especificando o PermissionEverywherepacote no manifesto.
user3570982
Eu executei PermissionEverywhereo aplicativo de demonstração de e não funcionou.
Ixx
2

Existe uma biblioteca muito simples que permite fazer exatamente isso. Você pode verificar as permissões de qualquer lugar (até mesmo de um serviço), com base no fato de o aplicativo estar em primeiro ou segundo plano, ele mostra uma caixa de diálogo normal ou gera uma notificação solicitando permissões. O código é muito fácil de entender e também é muito fácil de usar.

Experimente: Permissões do Android

Nishkarsh
fonte
-2

Você pode usar ResultReceiverpara criar um receptor da resposta do usuário e, em seguida, passá-lo como retorno de chamada para a Atividade, por meio de notificações PendingIntent. Referência

Farrux Bahodirov
fonte