Eu estava examinando o documento oficial sobre o novo modelo de Permissões no Android M. Ele fala sobre a shouldShowRequestPermissionRationale()
função que retorna true
se o aplicativo solicitou essa permissão anteriormente e o usuário negou a solicitação. Se o usuário recusou a solicitação de permissão no passado e escolheu a opção Não perguntar novamente, esse método retornará false
.
Mas como podemos diferenciar os dois casos a seguir?
Caso 1 : o aplicativo não tem permissão e o usuário não foi solicitado antes. Nesse caso, shouldShowRequestPermissionRationale () retornará false, porque é a primeira vez que solicitamos ao usuário.
Caso 2 : o usuário negou a permissão e selecionou "Não perguntar novamente"; nesse caso, também deveriaShowRequestPermissionRationale () retornará false.
Gostaria de enviar o usuário para a página de configurações do aplicativo no caso 2. Como faço para diferenciar esses dois casos?
fonte
shouldShowRequestPermissionRationale()
retorna falso neste caso, o que prejudicará qualquer código que contenha um sinalizador "já perguntei antes".permissions
Android. github.com/android/permissions-samplesRespostas:
Após M Preview 1, se a caixa de diálogo for exibida pela primeira vez , não haverá a caixa de seleção Nunca perguntar novamente .
Se o usuário negar a solicitação de permissão, haverá uma caixa de seleção Nunca perguntar novamente na caixa de diálogo de permissão na segunda vez que a permissão for solicitada.
Portanto, a lógica deve ser assim:
Solicitar permissão:
Verifique se a permissão foi negada ou concedida
onRequestPermissionsResult
.Se a permissão foi negada anteriormente, desta vez, haverá uma caixa de seleção Nunca perguntar novamente na caixa de diálogo de permissão.
Ligue
shouldShowRequestPermissionRationale
para verificar se o usuário verificou Nunca perguntar novamente .shouldShowRequestPermissionRationale
O método retornará false apenas se o usuário selecionado Nunca perguntar novamente ou a política do dispositivo proibir o aplicativo de ter essa permissão:Portanto, você não precisará rastrear se um usuário marcou Nunca perguntar novamente ou não.
fonte
context
noActivityCompat.shouldShowRequestPermissionRationale(...)
parâmetro é realmente do tipoActivity
. Pode não afetar todos, mas, no meu caso, afeta.should
para o retorno de chamada e salvar seu contra-valor no NVM apenas para saber se preciso solicitar a solicitação novamente na próxima vez que o aplicativo for aberto! ... uau (facepalm) ... foi muito difícil fazer apenas uma chamada retornando uma enumeração de status?Eu tive o mesmo problema e descobri. Para tornar a vida muito mais simples, escrevi uma classe util para lidar com permissões de tempo de execução.
E os métodos PreferenceUtil são os seguintes.
Agora, tudo que você precisa é usar o método checkPermission com argumentos adequados.
Aqui está um exemplo,
Você receberá retorno de chamada em onPermissionAsk no caso 1 e em onPermissionDisabled no caso 2.
Feliz codificação :)
fonte
public void onPermissionAsk() { ActivityCompat.requestPermissions( thisActivity, ...
.thisActivity
é nada além deYourActivity.this
.context
você está usando?shouldShowRequestPermissionRationale(permission)
não existe emandroid.content.Context
. está em ActivityCompatATUALIZAR
Acredito que a resposta do CanC abaixo seja a correta que deve ser seguida. A única maneira de ter certeza é verificar isso no retorno de chamada onRequestPermissionResult usando shouldShowPermissionRationale.
==
Minha resposta original:
A única maneira que eu encontrei é acompanhar por conta própria se é a primeira vez ou não (por exemplo, usando preferências compartilhadas). Se não for a primeira vez, use
shouldShowRequestPermissionRationale()
para diferenciar.Veja também: Android M - verifique a permissão de tempo de execução - como determinar se o usuário verificou "Nunca perguntar novamente"?
fonte
Pelo que entendi, shouldShowRequestPermissionRationale () executa vários casos de uso ocultos e notifica o aplicativo se deve ou não mostrar uma explicação sobre as permissões solicitadas.
A idéia por trás das permissões de tempo de execução é que, na maioria das vezes, o usuário dirá Sim à solicitação de permissão. Dessa forma, o usuário precisará fazer apenas um clique. Obviamente, a solicitação deve ser usada no contexto correto - ou seja, solicitando a permissão da câmera quando o botão "Câmera" é pressionado.
Se o usuário negar a solicitação, mas depois de algum tempo aparecer e pressionar o botão "Câmera" novamente, shouldShowRequestPermissionRationale () retornará true, para que o aplicativo possa mostrar uma explicação significativa por que a permissão é solicitada e por que o aplicativo não funcionar corretamente sem ele. Normalmente, você mostraria nessa janela de diálogo um botão para negar novamente / decidir mais tarde e um botão para conceder as permissões. O botão conceder permissões na caixa de diálogo de justificativa deve iniciar a solicitação de permissão novamente. Dessa vez, o usuário também terá uma caixa de seleção "Nunca mostrar novamente". Se ele decidir selecioná-lo e negar a permissão novamente, notificará o sistema Android de que o usuário e o aplicativo não estão na mesma página. Essa ação teria duas consequências - shouldShowRequestPermissionRationale () sempre retornará false,
Mas também há outro cenário possível em que onRequestPermissionsResult pode ser usado. Por exemplo, alguns dispositivos podem ter uma política de dispositivo que desativa a câmera (trabalhando para CIA, DARPA, etc). Nesses dispositivos, onRequestPermissionsResult sempre retornará false, e o método requestPermissions () negará silenciosamente a solicitação.
Foi o que reuni ouvindo o podcast com Ben Poiesz - gerente de produto na estrutura do Android.
http://androidbackstage.blogspot.jp/2015/08/episode-33-permission-mission.html
fonte
Basta postar outra opção, se alguém quiser. Você pode usar o EasyPermissions, fornecido pelo próprio Google, para, como dito, "Simplificar as permissões do sistema Android M".
Então você não precisa lidar
shouldShowRequestPermissionRationale
diretamente.fonte
permissionPermanentlyDenied
internamente apenas chamadasshouldShowPermissionsRationale
e retornostrue
no caso em que o usuário nunca foi solicitado a conceder permissões.Se alguém estiver interessado em uma solução Kotlin, refatorei a resposta do @muthuraj para estar no Kotlin. Também modernizou um pouco o bloqueio de conclusão em vez dos ouvintes.
PermissionUtil
PermissionHandler
Implementação
fonte
Verifique esta implementação. está funcionando muito bem para mim. basicamente, você verifica as permissões no método checkPermissions () passando uma lista de permissões. Você verifica o resultado da solicitação de permissão em onRequestPermissionsResult (). A implementação permite abordar os dois casos em que o usuário seleciona "nunca perguntar novamente" ou não. Nesta implementação, caso se selecione "nunca perguntar novamente", a caixa de diálogo tem uma opção para levá-lo à atividade de configurações do aplicativo.
Todo esse código está dentro do meu fragmento. Eu estava pensando que seria melhor criar uma classe especializada para fazer isso, como um PermissionManager, mas não tenho certeza.
fonte
Pode ser útil para alguém: -
O que notei é que, se verificarmos o sinalizador shouldShowRequestPermissionRationale () no método de retorno de chamada onRequestPermissionsResult (), ele mostrará apenas dois estados.
Estado 1: -Retorno verdadeiro: - Sempre que o usuário clicar em Negar permissões (incluindo a primeira vez).
Estado 2: -Retorna false: - se o usuário selecionar "nunca pede novamente".
Link para exemplo de trabalho detalhado .
fonte
Podemos fazer assim?
fonte
shouldShowRequestPermissionRationale
para permissão ESPECIAL sempre retorne VERDADEIRO SOMENTE depois que o usuário negou sem caixa de seleçãoEstamos interessados no valor FALSE
Portanto, há 3 casos perdidos com valor falso :
1. não havia essa ação anteriormente e agora o usuário decide concordar ou negar.
Basta definir uma preferência
ASKED_PERMISSION_*
que não existe agora e seria verdadeira noonRequestPermissionsResult
início, em qualquer caso de concordar ou negarPortanto, embora essa preferência não exista, não há motivo para verificar
shouldShowRequestPermissionRationale
2. o usuário clicou em concordar.
Simplesmente faça:
O qual retornará verdadeiro e não há motivo para verificar
shouldShowRequestPermissionRationale
3. usuário clicou em negar com a caixa de seleção (segunda ou mais vezes solicitada)
É A HORA DE TRABALHAR, com o
shouldShowRequestPermissionRationale
qual retornará FALSE(existe preferência e não temos permissão)
fonte
Esse código solicita que o usuário solicite permissão durante o tempo de execução, se o usuário permitir, execute o método de resultado, se o usuário negar, pergunte novamente com descrição com o usuário negue (peça novamente com instruções), mas se o usuário optar por nunca solicitar novamente. ele lida com nunca perguntar novamente, exibir a opção de configurações abertas com instruções.
fonte