J'essaie d'obtenir les coordonnées GPS à afficher lorsque je clique sur un bouton dans ma disposition d'activité. Voici la méthode qui est appelée lorsque je clique sur le bouton:
public void getLocation(View view) {
TextView tv = (TextView) findViewById(R.id.gps_coord_view);
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
tv.setText("Latitude: " + loc.getLatitude() + "\nLongitude: " + loc.getLongitude());
}
J'obtiens une erreur qui dit
L'appel nécessite une autorisation qui peut être rejetée par l'utilisateur. Le code doit vérifier explicitement si l'autorisation est disponible.
J'ai déjà accordé ces autorisations dans mon AndroidManifest
. L'erreur est prise en charge et l'application se compile lorsque j'ajoute ce qui suit avant d'appeler lm.getLastKnownLocation
:
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Cependant, l'application se bloque lorsque j'appuie sur le bouton qui appelle getLocation lorsque l'utilisateur clique dessus. Que se passe-t-il? Existe-t-il un moyen meilleur / plus simple pour saisir les coordonnées GPS de l'appareil?
la source
Réponses:
Avec le niveau d'API Android (23), nous devons vérifier les autorisations. https://developer.android.com/training/permissions/requesting.html
J'ai eu le même problème, mais ce qui suit a fonctionné pour moi et je suis en mesure de récupérer les données de localisation avec succès:
(1) Assurez-vous que vos autorisations sont répertoriées dans le manifeste:
(2) Assurez-vous de demander des autorisations à l'utilisateur:
(3) Assurez-vous d'utiliser ContextCompat car il est compatible avec les anciens niveaux d'API.
(4) Dans votre service de localisation, ou classe qui initialise votre LocationManager et obtient le dernier emplacement connu, nous devons vérifier les autorisations:
(5) Cette approche n'a fonctionné pour moi qu'après avoir inclus @TargetApi (23) en haut de ma méthode initLocationService.
(6) J'ai également ajouté ceci à ma version gradle:
Voici mon LocationService pour référence:
J'ai testé avec un appareil Android Lollipop jusqu'à présent uniquement. J'espère que cela fonctionne pour toi.
la source
SOLUTION SIMPLE
Je voulais prendre en charge les applications antérieures à l'api 23 et au lieu d'utiliser,
checkSelfPermission
j'ai utilisé un try / catchla source
La dernière partie du message d'erreur que vous avez cité indique:
...with ("checkPermission") or explicitly handle a potential "SecurityException"
Un moyen beaucoup plus rapide / plus simple de vérifier si vous disposez des autorisations consiste à entourer votre code
try { ... } catch (SecurityException e) { [insert error handling code here] }
. Si vous avez des autorisations, la partie 'try' s'exécutera, sinon la partie 'catch' le fera.la source
Utilisez ma classe personnalisée pour vérifier ou demander une autorisation
la source
si vous travaillez sur des autorisations dynamiques et des autorisations telles que ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION donnant l'erreur " Impossible de résoudre la méthode PERMISSION_NAME" dans ce cas, écrivez votre code avec le nom de l'autorisation, puis reconstruisez votre projet, cela régénérera le fichier manifeste (Manifest.permission).
la source
Si vous voulez simplement vérifier les autorisations (plutôt que demander des autorisations), j'ai écrit une simple extension comme celle-ci:
Maintenant, si je veux vérifier une autorisation, je peux simplement transmettre une autorisation comme celle-ci:
la source