2
votes

Erreur Android Studio @ androidx.annotation.NonNull lorsque onRequestPermissionResult est appelé dans MapFragment

Bonjour, je suis encore assez nouveau dans ce domaine, alors aidez-moi à comprendre pourquoi j'ai cette erreur. J'ai essayé de nombreuses solutions, donc je vais juste énumérer tout ce que j'ai fait car je n'arrive pas à comprendre pourquoi cela se produit.

J'ai créé un projet qui intègre GoogleMaps au minimum SDK 21 pour cibler / compiler au SDK 28. J'ai appelé les permissions nécessaires dans le Manifeste.

J'ai créé un fichier qui étend la classe MapFragment et tout semble bien fonctionner. Je suis en mesure de vérifier et de demander l'autorisation pour l'emplacement de l'utilisateur (la boîte apparaît), mais lorsque j'ai appelé la méthode onRequestPermissionResult, elle s'affiche différemment et me donne une erreur en disant " erreur: impossible de trouver la classe de symboles NonNull em> ":

 private boolean checkAskPermission(int requestCode, String permissionString){
    if(Build.VERSION.SDK_INT >= 23){
        int permission = ContextCompat.checkSelfPermission(mContext, permissionString);
        if(permission!=PackageManager.PERMISSION_GRANTED){
            requestPermissions(new String[]{permissionString}, requestCode);
            return false;
        }
    }
    return true;
}

Dans mes autres classes Fragment (android.support.v4.app), @ androidx.annotation.NonNull est à la place @NonNull. J'ai d'abord pensé que je devais peut-être ajouter implementation 'com.android.support:support-annotations:28.0.0' à build.gradle, mais ce n'était pas le cas. J'ai ensuite essayé de simplement remplacer @ androidx.annotation.NonNull par @NonNull, ce qui a fait disparaître l'erreur, mais chaque fois que je cliquais sur autoriser ou refuser, cela ne touchait pas la méthode onRequestPermissionResult.

J'ai créé une méthode qui vérifie une autorisation, mais il ne me permettra pas d'utiliser requestPermission seul sans vérifier si la construction est supérieure ou égale à SDK 23, mais mon SDK min est 21. Donc, à la place, je viens de vérifier si la construction est supérieure ou égale à 21 et utilisé ActivityCompat pour obtenir la méthode requestPermission et cela fonctionne. Il vérifiera et demandera la permission, donc je pense que peut-être onRequestPermissionResult ne fonctionne que dans MainActivity, ce que je ne veux pas. Je veux pouvoir appeler une méthode après avoir vérifié si la demande a été accordée à l'intérieur du MapFragment. Est-ce parce que MapFragment n'est pas pris en charge avec android.support.v4.app? Cela ressemble à ceci:

 private boolean checkAskPermission(int requestCode, String permissionString){
    if(Build.VERSION.SDK_INT >= 21){
        int permission = ContextCompat.checkSelfPermission(mContext, permissionString);
        if(permission!=PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(getActivity(), new String[]{permissionString}, requestCode);
            return false;
        }
    }
    return true;
}

À ce stade, je ne sais pas quoi essayer d'autre. Je pensais que je ne vérifiais peut-être pas correctement l'autorisation dans onRequestPermissionResult lorsque je change @ androidx.annotation.NonNull en @NonNull pour pouvoir l'utiliser, mais la méthode ne fonctionne pas lorsque j'utilise une pause. P >

Veuillez laisser des réponses détaillées afin que je puisse comprendre pleinement mon problème. Cela fait un jour que je suis bloqué.

Modifier: Solution

@Override
public void onRequestPermissionsResult(int requestCode, @androidx.annotation.NonNull String[] permissions, @androidx.annotation.NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
} 

et je viens de modifier la @ androidx.annotation .NonNull à @NonNull et maintenant il atteint la méthode.

Merci à Eugene d'avoir effacé les autorisations du SDK. Seul le SDK 23 et supérieur nécessite une autorisation.


0 commentaires

3 Réponses :


0
votes

[...] mais la méthode ne fonctionne pas lorsque j'utilise une pause.

[...] a utilisé ActivityCompat pour obtenir la requestPermission [...]

Vous êtes dans un fragment. Ne demandez pas les autorisations à l'activité. Si vous demandez le fragment, vous obtenez également un rappel dans le fragment.

requestPermissions(new String[]{permissionString}, requestCode);

Les autorisations d'exécution ont été introduites dans l'API 23 (c'est pourquoi la méthode n'est disponible que depuis l'API 23). Réparez votre condition. Avant cela, il suffit de déclarer l'autorisation dans le manifeste.

Hors sujet: les fragments de plate-forme sont obsolètes. Utilisez plutôt des fragments de support. Extend SupportMapFragment.

@ androidx.annotation.NonNull est introuvable car vous n'utilisez pas AndroidX dans votre projet. Vous pouvez utiliser toute autre annotation @NonNull disponible (à partir du SDK ou de la bibliothèque de support).


3 commentaires

Il n'est donc pas nécessaire de demander à l'utilisateur l'autorisation de lire et d'écrire sur le stockage externe si son SDK est inférieur à 23? J'ai juste besoin de vérifier 23 ans et plus


Ouais, pourquoi pensez-vous que c'était 21?


Je devais juste changer la condition et tout fonctionne maintenant. Je pense que je viens de le confondre avec "après l'introduction de 23 autorisations" comme avoir toujours à demander quoi qu'il arrive, mais maintenant je comprends que cela signifie tout ce que le SDK 23 et plus. Merci!! J'ai également changé MapFragment en SupportMapFragment



3
votes

importez cette classe d'annotation:

 @NonNull

qui provient soit de cette dépendance:

implementation "com.android.support:support-annotations:28.0.0"

soit de cette dépendance, au cas où ce ne serait pas le cas encore en utilisant androidx:

implementation "androidx.annotation:annotation:1.0.0"

alors vous pouvez l'utiliser comme d'habitude:

import androidx.annotation.NonNull;


0 commentaires

2
votes

Le seul moyen de contournement que j'ai trouvé utile était de supprimer la commande react-native run-android et d'accéder manuellement à la bibliothèque react-native (pour moi: ProjectHome / node_modules / ModuleIWantToChange / android / src / main / java / FileToChange.java ) qui importait androidx.annotation.NonNull , en changeant cette dépendance en android.support.annotation.NonNull puis assurez-vous de compiler avec le com.android.support:support-annotations sous "dependencies" dans le fichier "android / build.gradle" de ce node_module. Dans mon cas, j'utilise la version "com.android.support:support-annotations:25.3.1". Vous devrez vous assurer que vous disposez de la version que vous appelez ici. Regardez ce que vous avez installé avec Android Studio sous $ ANDROID_HOME / extras / android / m2repository / com / android / support / support-annotations .

Ensuite, au lieu de react-native run-android, j'ai déplacé vers le répertoire android sous le répertoire personnel du projet et j'ai exécuté sudo ./gradlew --stacktrace installDebug (stacktrace est facultatif) pour construire installez l'apk sur mon émulateur / appareil.

Cela pourrait ne pas fonctionner pour tout le monde, mais c'était une solution tolérable dans mon cas.


0 commentaires