Estou atualizando nosso aplicativo para usar o novo sistema de permissões de tempo de execução M. Está tudo funcionando, exceto onRequestPermissionsResult (). Preciso verificar uma permissão pressionando o botão e, se tiver êxito, enviar uma mensagem de texto. Quando concedo permissão para fazê-lo, a caixa de diálogo é fechada, mas não aciona o envio de texto até que eu pressione o botão novamente.
Depurei e defini pontos de interrupção no método onRequestPermissionsResult (), mas ele nunca entra nele.
Este método é chamado primeiro:
private void askForPermission() {
String[] permissions = new String[]{Manifest.permission.SEND_SMS};
ActivityCompat.requestPermissions(getActivity(), permissions, PERMISSIONS_CODE);
}
E então meu retorno de chamada fica assim:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_CODE) {
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
int grantResult = grantResults[i];
if (permission.equals(Manifest.permission.SEND_SMS)) {
if (grantResult == PackageManager.PERMISSION_GRANTED) {
onPPSButtonPress();
} else {
requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSIONS_CODE);
}
}
}
}
}
Alguém já teve um problema semelhante? Agradeço qualquer ajuda com isso. obrigado
fonte
Fragment.requestPermissions()
, a Atividade pai realmente está recebendo oonRequestPermissionsResult()
. (Isso é com a biblioteca de suporte 23.3.0)Você pode tentar isso:
Se você está chamando esse código de um fragmento, ele possui seu próprio método requestPermissions. Acredito que o problema é que você está chamando método estático.
Dica profissional, se você quiser o
onRequestPermissionsResult()
fragmento:FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)
fonte
Espero que funcione bem
Para atividade:
Para Fragmento:
fonte
Eu também encontrei esse problema. Se você deseja que a atividade que lida com permissões não esteja no histórico / recentes, será tentada a alterar sua
AndroidManifest.xml
entrada.Se você definir a atividade que você chama
requestPermissions
ouAppCompatActivity.requestPermissions
comno seu
AndroidManifest.xml
entãoonRequestPermissionsResult()
não será chamado. Isso é verdade se sua atividade é derivada deActivity
ouAppCompatActivity
.Isso pode ser corrigido removendo os dois sinalizadores de 'AndroidManifest.xml' e finalizando sua atividade
finishAndRemoveTask()
.fonte
Se você possui
onRequestPermissionsResult
atividade e fragmento, lembre-se de chamar asuper.onRequestPermissionsResult
atividade. Não é necessário no fragmento, mas está em atividade.fonte
FragmentActivity.onRequestPermissionsResult(..)
é para onde a chamada para o fragmentoonRequestPermissionsResult(..)
é encaminhada.Resposta descontinuada, consulte: https://developer.android.com/training/permissions/requesting
Fragmento interno, você precisa chamar:
Não:
fonte
Se você estiver usando requestPermissions no fragmento, ele aceitará 2 parâmetros em vez de 3.
Você deveria usar
requestPermissions(permissions, PERMISSIONS_CODE);
fonte
Se, por algum motivo, você estendeu uma Atividade personalizada localizada em alguma biblioteca externa que não chama o super, precisará chamar manualmente o Fragmento super.onRequestPermissionsResult na sua Atividade onRequestPermissionsResult.
fonte
Você tem a função checkPermissions para dispositivos anteriores ao Marshmallow no FragmentCompat . Eu uso assim:
fonte
Eu descobri que é importante onde você chama
android.support.v4.app.Fragment.requestPermissions
.Se você fizer isso
onCreate()
,onRequestPermissionsResult()
nunca será chamado.Solução: Ligue
onActivityCreated()
;fonte
onActivityCreated()
no meu código. SDK 23.onPause()
?Esse problema estava realmente sendo causado por NestedFragments. Basicamente, na maioria dos fragmentos, estendemos um HostedFragment que, por sua vez, estende um CompatFragment. A presença desses fragmentos aninhados causou problemas que foram resolvidos por outro desenvolvedor no projeto.
Ele estava fazendo algumas coisas de baixo nível, como troca de bits, para que isso funcionasse, então não tenho certeza da solução final real
fonte
fonte
Isso vai funcionar ..
fonte
Se você está chamando esse código de um fragmento, ele possui seu próprio método requestPermissions.
O conceito básico é que, se você estiver em uma atividade, chame
e se em um fragmento, basta ligar
fonte
FragmentCompat.requestPermissions()
.Eu tive um problema semelhante, exceto que estava pressionando um botão para fazer uma chamada, o que aciona o callIntent. Verifiquei a permissão primeiro, se não for concedida, peço permissão e onRequestPermissionResult chamo a permissão de verificação e ligo novamente.
fonte
Com base na resposta da goodgamerguy, a solução é:
fonte
Antes de verificar tudo de acordo com as respostas acima, verifique se o seu código de solicitação não é 0 !!!
verifique o código de onRequestPermissionsResult () em FragmentActivity.java:
fonte
fonte
Eu tenho uma solução incrível para conseguir isso, faça uma BaseActivity como esta.
}
Agora você pode chamar o código para pedir permissão como esta
Agora, toda vez que isso acontece em qualquer lugar, seja no seu fragmento ou em qualquer atividade, a atividade base seria chamada.
obrigado
fonte
Você pode usar
requestPermissions(PERMISSIONS, MULTIPLE_PERMISSIONS_CODE);
. Não use FragmentCompat se você estiver usando a v4.fonte
Detalhes
Algoritmo
módulo - câmera, localização, ....
Recursos
Solução
Uso em atividade (no mesmo fragmento)
fonte
Aqui eu quero mostrar meu código como eu gerenciei isso.
Aqui nesta classe, quero verificar a permissão concedida ou não. Não é, então irei chamar a permissão da minha MainActivity como
Agora, no método onCreate, você precisa chamar a função requestForPermission ().
Além disso, você também pode solicitar várias permissões de cada vez.
fonte
UPDATE: vi a resposta de outra pessoa sobre chamar
super.onRequestPermissionResult()
Activity e isso corrige o problema do código de solicitação que mencionei e chama o onRequestPermissionResult do fragmento.ignore essas coisas:
Para mim, estava chamando o
onRequestPermissionResult
de Activity, apesar de eu ter chamadofragment.requestPermission(...)
, mas retornou o resultado com um requestCode incorreto (111 se transformou em 65647 por que ??? eu nunca vou saber).Felizmente, esta é a única permissão que solicitamos nessa tela, então eu simplesmente ignoro o código de solicitação (não tenha tempo para descobrir por que não está correto no momento)
fonte
Também encontrei um problema que, mesmo se você chamar requestPermissions, ainda poderá ter esse problema. O problema é que a atividade pai pode substituir esse método sem chamar super. Adicione super e será corrigido.
fonte