J'essaie d'obtenir la position actuelle du GPS ou du fournisseur de réseau pour lequel j'utilise ces autorisations en la déclarant dans AndroidManifest.xml,
ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
Je valide l'autorisation au moment de l'exécution comme,
ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
et
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
Cela fonctionne bien pour moi avec Android SDK version 22 alors que dans SDK version 25 bien que l'autorisation soit déclarée dans AndroidManifest.xml, elle n'est pas reflétée lors de l'exécution.
J'ai vérifié si ces autorisations sont accordées ou non par,
paquet adb shell dumpsys com.abc.xyz
Les autorisations n'ont pas été accordées pour mon application qui s'exécute sur le SDK-25 lorsque j'ai essayé d'accorder l'autorisation avec le shell adb comme,
adb shell pm grant com.abc.xyz android.Manifest.permission.ACCESS_COARSE_LOCATION
Je soupçonne qu'Android a accordé ces autorisations à partir de la version 25 du SDK (veuillez me corriger si je me trompe). Avec une simple recherche sur Google, je ne suis pas en mesure de comprendre comment le niveau d'autorisation / la gravité a changé entre les versions du SDK.
S'il vous plaît, aidez-moi à le savoir.
4 Réponses :
Essayez celle-ci.
private boolean RequestPermissions() { int camera = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.CAMERA); int storage = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE); List<String> listPermissionsNeeded = new ArrayList<>(); if (camera != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(CAMERA); } if (storage != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(WRITE_EXTERNAL_STORAGE); listPermissionsNeeded.add(READ_EXTERNAL_STORAGE); } if (!listPermissionsNeeded.isEmpty()) { ActivityCompat.requestPermissions(getActivity(), listPermissionsNeeded.toArray (new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS); return false; } return true; }
c'est la fonction qui vérifie si l'autorisation est nécessaire et si elles ne sont pas disponibles, elle demandera à l'utilisateur.
Est-ce vraiment nécessaire pour le demander à l'utilisateur? Comment puis-je vérifier si Android impose de telles restrictions avec les versions du SDK?
Où puis-je vérifier ces informations? Je ne parviens pas à le trouver avec la documentation du développeur Android.
Sur toutes les versions d'Android, votre application doit déclarer les autorisations normales et dangereuses dont elle a besoin dans son manifeste d'application, comme décrit dans Déclaration des autorisations. Cependant, l'effet de cette déclaration est différent selon la version du système et le niveau SDK cible de votre application:
Si le SDK cible de votre application est inférieur ou égal à 22: si vous répertoriez une autorisation dangereuse dans votre
manifest, l'utilisateur doit accorder l'autorisation lorsqu'il installe le
app; s'ils n'accordent pas l'autorisation, le système n'installe pas du tout l'application.
Si le SDK cible de votre application est égal ou supérieur à 23: l'application doit répertorier les autorisations dans le manifeste et elle doit demander chaque autorisation dangereuse dont elle a besoin pendant l'exécution de l'application. L'utilisateur peut accorder ou refuser chaque autorisation, et l'application peut continuer à s'exécuter avec une
capacités même si l'utilisateur refuse une demande d'autorisation.
vous pouvez vous référer à ce Lien
vous pouvez consulter le lien mentionné ci-dessus pour la documentation des développeurs Android
Une autre chose que vous devez garder à l'esprit: ACCESS_FINE_LOCATION
vous donne une localisation meilleure et plus précise et ACCESS_COARSE_LOCATION
vous donne une localisation moins précise.
ACCESS_FINE_LOCATION inclut ACCESS_COARSE_LOCATION. Cependant, il y a un hic:
ACCESS_COARSE_LOCATION vous donne le dernier emplacement connu qui est compatible avec la batterie https: //developer.android.com/training/location/retrieve-current.html#setup
Cependant, si vous avez besoin de quelque chose comme une localisation en direct / en temps réel comme Pokemon Go, utilisez ACCESS_FINE_LOCATION Il vous donne une localisation en direct / en temps réel.
ACCESS_FINE_LOCATION
couvre les deux. Lorsque vous avezACCESS_FINE_LOCATION
, vous n'avez pas besoin deACCESS_COARSE_LOCATION
. \Lisez developer.android.com/guide/topics/location/… a> pour clarifier.