De acordo com isso: http://developer.android.com/preview/features/runtime-permissions.html#coding um aplicativo pode verificar permissões de tempo de execução e solicitar permissões, se ainda não tiver sido concedido. A seguinte caixa de diálogo será exibida:
Caso o usuário recuse uma permissão importante, o aplicativo deve exibir uma explicação de por que a permissão é necessária e qual o impacto da recusa. Essa caixa de diálogo possui duas opções:
- tente novamente (a permissão é solicitada novamente)
- negar (o aplicativo funcionará sem essa permissão).
Se o usuário verificar Never ask again
, no entanto, a segunda caixa de diálogo com a explicação não deverá ser mostrada, especialmente se o usuário já recusou uma vez. Agora, a pergunta é: como meu aplicativo sabe se o usuário verificou o Never ask again
? OMI onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
não me dá essa informação.
Uma segunda pergunta seria: o Google planeja incorporar uma mensagem personalizada na caixa de diálogo de permissão que explicaria por que o aplicativo precisa da permissão? Dessa forma, nunca haveria um segundo diálogo que certamente contribuísse para uma melhor experiência de usuário.
fonte
Respostas:
A prévia do desenvolvedor 2 traz algumas alterações na forma como as permissões são solicitadas pelo aplicativo (consulte também http://developer.android.com/preview/support.html#preview2-notes ).
A primeira caixa de diálogo agora fica assim:
Não existe a caixa de seleção "Nunca mostrar novamente" (diferente da visualização 1 do desenvolvedor). Se o usuário negar a permissão e se a permissão for essencial para o aplicativo, ele poderá apresentar outra caixa de diálogo para explicar o motivo pelo qual o aplicativo solicita essa permissão, por exemplo:
Se o usuário recusar novamente, o aplicativo deverá desligar se precisar absolutamente dessa permissão ou continuar executando com funcionalidade limitada. Se o usuário reconsiderar (e selecionar tentar novamente), a permissão será solicitada novamente. Desta vez, o prompt é assim:
Na segunda vez, a caixa de seleção "Nunca perguntar novamente" é exibida. Se o usuário negar novamente e a caixa de seleção estiver marcada, nada mais deve acontecer. Se a caixa de seleção está marcada ou não, pode ser determinada usando Activity.shouldShowRequestPermissionRationale (String), por exemplo:
É o que diz a documentação do Android ( https://developer.android.com/training/permissions/requesting.html ):
Para saber se o usuário negou "nunca perguntar novamente", verifique novamente o método shouldShowRequestPermissionRationale no seu onRequestPermissionsResult quando o usuário não concedeu a permissão.
Você pode abrir a configuração do seu aplicativo com este código:
Não há como enviar o usuário diretamente para a página Autorização.
fonte
Você pode verificar o
shouldShowRequestPermissionRationale()
seuonRequestPermissionsResult()
.https://youtu.be/C8lUdPVSzDk?t=2m23s
Verifique se a permissão foi concedida ou não
onRequestPermissionsResult()
. Caso contrário , verifiqueshouldShowRequestPermissionRationale()
.true
, mostre uma explicação de por que essa permissão específica é necessária. Então, dependendo da escolha do usuário novamenterequestPermissions()
.false
, mostrará uma mensagem de erro de que a permissão não foi concedida e o aplicativo não pode prosseguir ou um recurso específico está desativado.Abaixo está o código de exemplo.
Aparentemente, o Google Maps faz exatamente isso para obter permissão de localização.
fonte
Aqui está um método fácil e agradável para verificar o status atual da permissão:
Advertência: retorna BLOCKED_OR_NEVER_ASKED a primeira inicialização do aplicativo, antes que o usuário aceite / negue a permissão por meio do prompt do usuário (nos dispositivos sdk 23+)
Atualizar:
A biblioteca de suporte do Android agora também parece ter uma classe muito semelhante
android.support.v4.content.PermissionChecker
que contém umacheckSelfPermission()
que retorna:fonte
BLOCKED_OR_NEVER_ASKED
se a permissão ainda não foi solicitada.android.content.pm
já definePERMISSION_GRANTED = 0
ePERMISSION_DENIED = -1
. Talvez conjuntoBLOCKED_OR_NEVER_ASKED = PERMISSION_DENIED - 1
ou algo assim?Depois que o usuário marcar "Não perguntar novamente", a pergunta não poderá ser exibida novamente. Mas pode ser explicado ao usuário que ele negou a permissão anteriormente e deve conceder permissão nas configurações. E referencie-o às configurações, com o seguinte código:
fonte
Pode ser útil para alguém: -
O que eu 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 do exemplo de trabalho detalhado
fonte
onRequestPermissionsResult
, não quando realmente solicita a permissão.Você pode determiná- lo verificando se a lógica da permissão deve ser mostrada dentro do
onRequestPermissionsResult()
método de retorno de chamada. E se você encontrar alguma permissão definida para nunca perguntar novamente , poderá solicitar que os usuários concedam permissões a partir das configurações.Minha implementação completa seria como abaixo. Ele funciona para solicitações de permissões únicas ou múltiplas . Use o seguinte ou use diretamente minha biblioteca.
fonte
Se você deseja detectar todos os "estados" (primeira vez negado, recém-negado, apenas negado com "Nunca perguntar novamente" ou negado permanentemente), faça o seguinte:
Crie 2 booleanos
Defina o primeiro antes de pedir permissão:
Defina o segundo dentro do seu método onRequestPermissionsResult:
Use a seguinte "tabela" para fazer o que você precisar em onRequestPermissionsResult () (depois de verificar se você ainda não tem permissão):
fonte
// TRUE FALSE
também ocorre quando o usuário permite uma permissão após negá-la anteriormente.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 o PreferenceUtil métodos são os seguintes.
Agora, tudo que você precisa é usar o método * checkPermission * com argumentos adequados.
Aqui está um exemplo,
Se o usuário marcar Nunca perguntar novamente , você receberá retorno de chamada em onPermissionDisabled .
Feliz codificação :)
fonte
shouldShowRequestPermissionRationale
, salvando de preferência a solicitação enviada ao usuário. Eu tive a mesma idéia e encontrei sua resposta. Bom trabalhoExplicação completa para todos os casos de permissão
fonte
Uma função útil para determinar se uma permissão arbitrária foi impedida de solicitar (no Kotlin):
O uso disso requer a configuração de uma preferência compartilhada booleana com o nome da sua permissão desejada (por exemplo
android.Manifest.permission.READ_PHONE_STATE
)true
quando você solicitar uma permissão pela primeira vez.Explicação:
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
como parte do código pode ser executada apenas no nível 23+ da API.ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED
para verificar se ainda não temos permissão.!activity.shouldShowRequestPermissionRationale(permission)
para verificar se o usuário negou o pedido novamente. Devido a peculiaridades dessa função , a seguinte linha também é necessária.PreferenceManager.getDefaultSharedPreferences(activity).getBoolean(permission, false)
isso é usado (juntamente com a definição do valor como true na primeira solicitação de permissão) para distinguir entre os estados "Nunca perguntei" e "Nunca pergunte novamente", pois a linha anterior não retorna essas informações.fonte
O método shouldShowRequestPermissionRationale () pode ser usado para verificar se o usuário selecionou a opção 'nunca perguntou novamente' e negou a permissão. Existem muitos exemplos de código, então eu prefiro explicar como usá-lo para esse fim, porque acho que seu nome e sua implementação tornam isso mais complicado do que realmente é.
Conforme explicado em Solicitando permissões no tempo de execução , esse método retorna true se a opção 'nunca perguntar novamente' estiver visível, caso contrário, false; portanto, retorna false na primeira vez em que uma caixa de diálogo é exibida; depois, na segunda vez, retorna true; somente se o usuário negar a permissão para selecionar a opção, nesse ponto, ele retornará false novamente.
Para detectar esse caso, você pode detectar a sequência falso-verdadeiro-falso, ou (mais simples), pode ter um sinalizador que monitora a hora inicial em que a caixa de diálogo é exibida. Depois disso, esse método retorna verdadeiro ou falso, onde o falso permitirá que você detecte quando a opção está selecionada.
fonte
Por favor, não jogue pedras em mim por esta solução.
Isso funciona, mas é um pouco "hacky".
Ao ligar
requestPermissions
, registre a hora atual.Então em
onRequestPermissionsResult
se o resultado não for concedido, verifique a hora novamente.
Como o usuário não pode clicar tão rapidamente no botão negar, sabemos que ele selecionou "nunca perguntar novamente" porque o retorno de chamada é instantâneo.
Use por sua conta e risco.
fonte
Eu escrevi um atalho para solicitação de permissão no Android M. Esse código também lida com a compatibilidade com versões anteriores de versões mais antigas do Android.
Todo o código feio é extraído para um Fragmento que se anexa e se desanexa da Atividade solicitando as permissões. Você pode usar
PermissionRequestManager
o seguinte:Dê uma olhada: https://gist.github.com/crysxd/385b57d74045a8bd67c4110c34ab74aa
fonte
fonte
Experimente esta biblioteca de permissões simples. Ele irá lidar com todas as operações relacionadas à permissão em 3 etapas fáceis. Isso economizou meu tempo. Você pode concluir todo o trabalho relacionado a permissões em 15 minutos .
Ele pode lidar com Negar, Ele pode lidar com Nunca pedir novamente, Pode chamar configurações do aplicativo para obter permissão, Pode dar uma mensagem do Rational, Pode dar uma mensagem de Negação, Pode fornecer uma lista de permissões aceitas, Pode fornecer uma lista de negadas permissões e etc.
https://github.com/ParkSangGwon/TedPermission
Etapa 1: adicione sua dependência
Etapa 2: pedir permissões
Etapa 3: manipular a resposta da permissão
fonte
você pode ouvir bonita.
Ouvinte
MainClass para permissão
Usado dessa maneira
substituir onRequestPermissionsResult na atividade ou fragmnet
fonte
Em vez disso, você receberá retorno de chamada
onRequestPermissionsResult()
como PERMISSION_DENIED quando solicitar novamente a permissão enquanto estiver em falsa condição deshouldShowRequestPermissionRationale()
No documento do Android:
Quando o sistema solicita que o usuário conceda uma permissão, o usuário tem a opção de informar ao sistema para não solicitar essa permissão novamente. Nesse caso, sempre que um aplicativo usar essa
requestPermissions()
solicitação novamente, o sistema negará imediatamente a solicitação. O sistema chama seuonRequestPermissionsResult()
método de retorno de chamada e passaPERMISSION_DENIED
, da mesma forma que faria se o usuário tivesse rejeitado sua solicitação explicitamente novamente. Isso significa que, quando você ligarequestPermissions()
, não pode assumir que alguma interação direta com o usuário ocorreu.fonte
Você pode usar o
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)
método para detectar se nunca perguntar está marcado ou não.Para mais referência: Marque esta
Para verificar várias permissões, use:
método explan ()
O código acima também mostrará uma caixa de diálogo, que redirecionará o usuário para a tela de configurações do aplicativo, de onde ele poderá dar permissão se tivesse marcado o botão nunca perguntar novamente.
fonte
Você pode usar
dentro
Veja o exemplo abaixo:
Verifique se ele tem permissão quando o usuário clica no botão:
Quando o usuário responder à caixa de diálogo de permissão, iremos para onRequestPermissionResult:
fonte
Eu também gostaria de obter as informações se o usuário selecionou ou não "nunca perguntar novamente". Consegui uma "quase solução" com uma bandeira de aparência feia, mas antes de contar como, falarei sobre minha motivação:
Gostaria de oferecer a funcionalidade de referência de permissão inicialmente. Se o usuário o usa e não possui direitos, ele obtém a 1ª caixa de diálogo de cima ou a 2ª e a 3ª. Quando o usuário escolher 'Nunca perguntar novamente', gostaria de desativar a funcionalidade e exibi-la de maneira diferente. - Minha ação é acionada por uma entrada de texto giratório, eu também gostaria de adicionar '(Permissão revogada)' ao texto do rótulo exibido. Isso mostra ao usuário: 'Existe funcionalidade, mas não posso usá-la devido às minhas configurações de permissão.' No entanto, isso não parece ser possível, pois não posso verificar se 'Nunca perguntar novamente' foi escolhido.
Cheguei a uma solução em que posso viver, tendo minha funcionalidade sempre ativada com uma verificação de permissão ativa. Estou mostrando uma mensagem Toast em onRequestPermissionsResult () no caso de uma resposta negativa, mas somente se eu não tiver mostrado meu pop-up racional personalizado. Portanto, se o usuário escolher 'Nunca perguntar novamente', ele receberá apenas uma mensagem. Se o usuário estiver relutante em escolher 'nunca perguntar novamente', ele obtém apenas o raciocínio personalizado e o pop-up de solicitação de permissão pelo sistema operacional, mas não brindam, pois três notificações seguidas seriam muito trabalhosas.
fonte
Eu tenho que implementar permissão dinâmica para a câmera. Onde ocorrem três casos possíveis: 1. Permitir, 2. Negado, 3. Não pergunte novamente.
fonte
Expandindo a resposta do mVck acima, a lógica a seguir determina se "Nunca perguntar novamente" foi verificado para uma determinada solicitação de permissão:
que é extraído de baixo (para o exemplo completo, veja esta resposta )
fonte
você pode ler o documento oficial do Android Solicitar permissões do aplicativo
ou você pode encontrar muitas bibliotecas populares de permissão para Android no Github
fonte
Para responder à pergunta com precisão, o que acontece quando o usuário pressiona "Nunca perguntar novamente"?
O método / função substituído
O array grantResult parece estar vazio, então você pode fazer algo lá, talvez? Mas não é a melhor prática.
Como lidar com "Never Ask Again"?
Estou trabalhando com o Fragment, que exigiu a permissão READ_EXTERNAL_STORAGE.
As outras funções são triviais.
fonte