Eu tenho um fragmento no qual tenho uma visão de reciclagem e definindo dados nessa visão de reciclagem usando o adaptador de visão de reciclagem.
Agora, estou com um botão no item de lista do adaptador clicando no qual preciso verificar a permissão READ_EXTERNAL_STORAGE no android para obter um novo modelo de permissão no android.
Eu criei uma nova função no fragmento deste adaptador para verificar se a permissão foi concedida ou não e, se já não tiver sido concedida, solicitar a permissão.
Passei MyFragment.this como um parâmetro no adaptador e, chamando o método do fragmento no botão, clique no adaptador.
Eu usei o código abaixo para chamar requestPermission no fragmento.
if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
}
Eu substituí o onRequestPermissionsResult
método no fragmento usando o código abaixo:
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case ConstantVariables.READ_EXTERNAL_STORAGE:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, proceed to the normal flow.
startImageUploading();
} else {}
Mas não está sendo chamado, em vez do método onRequestPermissionsResult desta atividade ser chamado.
Eu defini o mesmo método onRequestPermissionsResult na atividade pai do fragmento também e está sendo chamado.
Não consigo remover o método onRequestPermissionsResult da atividade, mas quero chamar o método onRequestPermissionsResult do fragmento quando solicito permissão do fragmento. Como posso fazer isso? Estou fazendo algo errado aqui, por favor me ajude se alguém tiver idéia aqui.
fonte
Respostas:
Resposta editada para cobrir problemas mais amplos
Eu acho que você está confundindo o método para fragmento e atividade. Tive um problema semelhante no meu projeto no mês passado. Por favor, verifique se você finalmente tem o seguinte:
super.onRequestPermissionsResult
da atividadeonRequestPermissionsResult
.Veja se isso ajuda.
fonte
super.onrequestpermissionresult
do resultado da solicitação de autorização da atividade chama o resultado da solicitação de autorização do fragmento quando solicito permissão usandorequestpermissions
. Isso é bom trabalhar agora, muito obrigado .. :)Solicitei permissão de localização de um fragmento e, no fragmento, precisava alterar isso:
para isso:
o onRequestPermissionsResult foi chamado no fragmento.
fonte
Esse é um erro comum que as pessoas cometem ao codificar marshmallow.
Quando em AppCompatActivity, você deve usar ActivityCompat.requestPermissions; Quando em android.support.v4.app.Fragment, você deve simplesmente solicitar requestPermissions (este é um método de instância de android.support.v4.app.Fragment) Se você chamar ActivityCompat.requestPermissions em um fragmento, o retorno de chamada onRequestPermissionsResult será chamado a atividade e não o fragmento.
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 estiver em um fragmento, basta ligar
Para referência, obtive a resposta neste link https://www.coderzheaven.com/2016/10/12/onrequestpermissionsresult-not-called-on-fragments/
fonte
O método
requestPermissions
em fragmentos requer API nível 23 ou superior.Se seu aplicativo segmentar uma versão inferior, você poderá usar
Primeiro você precisa adicionar a dependência support-v13:
fonte
mude isso :
para isso :
fonte
alterar permissão
fonte
Esta resposta aceita não foi trabalhada para mim, então encontrei minha própria solução, explicada abaixo:
Primeiro, criei um método, no fragmento:
2.E então o chamou de sua atividade subjacente:
E está funcionando ...
fonte
Verifique se tanto
PERMISSION_REQUEST_CODE
emonRequestPermissionsResult
e dentro de suaFragment
contém o mesmo valor.fonte
Para o tragetSDK 28, a verificação do SDK (> 23) e as permissões de solicitação do fragmento funcionariam. O ActivityCompat.requestPermissions está falhando (se você definir o código de solicitação abaixo de 65536, a caixa de diálogo de permissão será exibida e, se o usuário permitir, as permissões serão fornecidas, mas não haverá retorno de chamada. Mas se você definir acima de 65536, o ActivityCompat.requestPermissions ocorrerá. falhe imediatamente. não sei o raciocínio por trás dessa lógica. pode ser um bug ou intencional).
Código de trabalho:
fonte
Se você estiver trabalhando com o Kotlin, especifique exatamente que está chamando o método de fragmento, não a atividade
Permissões do Android M: onRequestPermissionsResult () não sendo chamado
Solicite permissões de tempo de execução da v4.Fragment e o retorno de chamada vá para Fragment?
fonte
Eu tive o mesmo problema. Seu fragmento pode ser inicializado a partir do layout da atividade. Curtiu isso:
main_activty.xml
Esse problema foi resolvido para mim quando eu usei
FragmentTransaction
vezfonte
nas APIs abaixo de 23, você pode criar uma interface na atividade e implementá-la no fragmento filho. Quando você obtiver uma solicitação de permissão, a atividade passará para a interface implementada no fragmento. É simples assim :)
fonte
você pode chamar o método Fragment abaixo
fonte
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