web-dev-qa-db-fra.com

onRequestPermissionsResult n'étant pas appelé dans un fragment s'il est défini à la fois dans le fragment et dans l'activité

J'ai un fragment dans lequel j'ai recyclerview et la définition des données dans cette recyclerview à l'aide de l'adaptateur recyclerview.

À présent, un élément de la liste de l'adaptateur contient un bouton sur lequel j'ai besoin de vérifier l'autorisation READ_EXTERNAL_STORAGE sous Android pour obtenir un nouveau modèle d'autorisation sous Android. 

J'ai créé une nouvelle fonction dans le fragment de cet adaptateur pour vérifier si l'autorisation est accordée ou non, et demander une autorisation si elle n'est pas déjà accordée.

J'ai passé MyFragment.this en tant que paramètre dans l'adaptateur et en appelant la méthode du fragment sur le bouton, cliquez sur l'adaptateur.

J'ai utilisé le code ci-dessous pour appeler requestPermission en fragment.

if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED)){
       requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                ConstantVariables.READ_EXTERNAL_STORAGE);
    }

J'ai remplacé la méthode onRequestPermissionsResult dans fragment en utilisant le code ci-dessous:

@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 {}

Mais il n'est pas appelé, mais la méthode onRequestPermissionsResult de cette activité est appelée. 

J'ai défini la même méthode onRequestPermissionsResult dans l'activité parent de fragment également et elle s'appelle.

Je ne peux pas supprimer la méthode onRequestPermissionsResult de l'activité mais je souhaite appeler la méthode onRequestPermissionsResult de fragment lorsque je demande l'autorisation de fragment . Comment puis-je procéder? Est-ce que je fais quelque chose de mal ici, aidez-moi s'il vous plaît si quelqu'un a une idée ici.

88
Prithniraj Nicyone

Réponse modifiée pour couvrir des problèmes plus vastes

Je pense que vous confondez la méthode de fragmentation et d’activité. Avait un problème similaire mon projet le mois dernier. S'il vous plaît vérifier si vous avez enfin ce qui suit:

  1. Dans AppCompatActivity, utilisez la méthode ActivityCompat.requestpermissions
  2. Dans le fragment de support v4, vous devez utiliser requestpermissions
  3. Catch est si vous appelez AppcompatActivity.requestpermissions dans votre fragment alors le rappel sera à l'activité 
  4. Assurez-vous d'appeler super.onRequestPermissionsResult à partir de la onRequestPermissionsResult de l'activité.

Voyez si ça aide. 

240
VarunJoshi129

J'ai demandé la permission d'emplacement d'un fragment et dans le fragment, j'avais besoin de changer ceci:

            ActivityCompat.requestPermissions(getActivity(), new String[]{
                Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);

pour ça:

            requestPermissions(new String[]{
                Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);

alors onRequestPermissionsResult a été appelé dans le fragment.

28
fullMoon

La méthode requestPermissions sur Fragments nécessite une API de niveau 23 ou supérieur.
Si votre application cible une version inférieure, vous pouvez utiliser

FragmentCompat.requestPermissions(this,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            ConstantVariables.READ_EXTERNAL_STORAGE);

Vous devez d’abord ajouter la dépendance support-v13:

implementation "com.Android.support:support-v13:$supportLibVersion"
6
Juan Cruz Soler
private void showContacts() {
 if (getActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
         != PackageManager.PERMISSION_GRANTED) {
     requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
             PERMISSIONS_REQUEST_READ_STORAGE);
 } else {
     doShowContacts();
 }

}

 @Override
 public void onRequestPermissionsResult(int requestCode, String[] permissions,
     int[] grantResults) {
 if (requestCode == PERMISSIONS_REQUEST_READ_STORAGE
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
     doShowContacts();
 }

}

changer la permission

1
user2002721

Vérifiez que PERMISSION_REQUEST_CODE inonRequestPermissionsResult et à l'intérieur de votreFragment contiennent la même valeur.

0
karenms

Pour tragetSDK 28, la vérification du SDK (> 23) et les demandes de permission de fragment fonctionneraient. ActivityCompat.requestPermissions échoue (si vous définissez un code de demande inférieur à 65536, la boîte de dialogue d'autorisation s'affichera. Si l'utilisateur autorise l'autorisation, les autorisations sont fournies, mais aucun rappel ne survient. Si vous définissez une valeur supérieure à 65536, ActivityCompat.requestPermissions échouer immédiatement. Je ne connais pas le raisonnement derrière cette logique. Peut-être un bogue ou intentionnel).

Code de travail:

  if (Build.VERSION.SDK_INT >= 23) {
                        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_ACCESS_REQUEST);
                    }
0
Raj kannan Iyyappan