Pourquoi est-FusedLocationApi.getLastLocation null
Je suis en train d'essayer d'obtenir de l'emplacement à l'aide de FusedLocationApi.getLastLocation
et j'ai obtenu les autorisations de position dans le fichier manifeste:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Cependant, je suis null
lorsque je demande l'emplacement du système. Je viens de tester d'allumer ou d'éteindre les services de localisation de sorte qu'il peut être lié à ce (bien sûr, c'est quand je suis en train d'essayer cela). Mais même après le retour null, je suis en attente pour onLocationChanged
d'être appelé et il n'est jamais appelé. J'ai aussi vu une question similaire ici: FusedLocationApi.getLastLocation toujours null
Voici mon code:
protected LocationRequest createLocationRequest() {
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(120000);
mLocationRequest.setFastestInterval(30000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
return mLocationRequest;
}
protected GoogleApiClient getLocationApiClient(){
return new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
LocationRequest locationRequest = createLocationRequest();
@Override
public void onLocationChanged(Location location) {
App.setLocation(location); //NEVER CALLED
}
@Override
public void onConnected(Bundle bundle) {
App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient)); //RETURNS NULL
LocationRequest locationRequest = createLocationRequest();
LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient, locationRequest, this);
}
Et sur onCreate
de mon application:
locationApiClient = getLocationApiClient();
locationApiClient.connect();
Où this
est mon objet application.
Pourquoi suis-je nul (oui, je ne sais que cela peut être null dans quelques rares cas, comme indiqué dans les documents, mais je suis TOUJOURS présent, il n'est pas rare) et toujours pas à obtenir l'emplacement des mises à jour par la suite? C'est un véritable appareil (Samsung Galaxy S3) sans carte SIM, si cela aide.
- Il n'y a pas
ACCESS_GPS
ouACCESS_LOCATION
autorisations dans Android. Au-delà de ça, il est très difficile de vous aider sans code. - Je ne sais pas comment j'ai fini cette manière, de toute façon, il ne devrait pas affecter le comportement.
- êtes-vous tester sur un périphérique réel? en plus de la documentation dit, Si le client n'est pas connecté null sera retourné. assurez-vous que votre client est connecté à l'ensemble.
- Pourriez-vous collez le code où vous initialiser l'api client et où vous aurez null?
- pour éviter null emplacement essayez d'utiliser à la fois les fournisseurs GPS_PROVIDER et NETWORK_PROVIDER et donc ajouter un réseau qui utilise des autorisations spécifiques
- oui, c'est un vrai appareil, voir ma mise à jour de question.
- mise à jour de la question.
- Poyrazoğlu ai du vous de vérifier ma réponse.Vous pouvez également le vérifier par paramétrer LocationRequest.PRIORITY_HIGH_ACCURACY, car il y a peut être pas une telle application qui geting emplacement de mise à jour de votre appareil.
- La solution de cette?
- oui, il suffit de suivre la première réponse.
- Je demande à tous de vous s'il vous plaît prendre un coup d'oeil à cette réponse stackoverflow.com/a/35833552/3278589
- la réponse est exactement la même merde, c'est tout sur ce post. La question n'est pas sujet de l'emplacement des rappels, la question est concernant FusedLocationProvider retourner null pour getLastLocation. Je suis pour ma part de le voir dire null, rapport correctement, puis le rapport de la valeur null à nouveau quelques secondes plus tard, sur certains appareils.
Vous devez vous connecter pour publier un commentaire.
Je suis en utilisant FusedLocationProvider api dans mon application,
Voici mon code qui fonctionne à la fois sur l'appareil et l'émulateur
ce travail est le code de la mine.
Espère que mon code vous aider.
Acclamations..
Fusionnées à l'emplacement du fournisseur ne pourra maintenir en arrière-plan si au moins un client est connecté. Maintenant, le simple fait d'activer le service de localisation ne sera pas garantie mémorisation de la dernière position connue.
Une fois le premier client se connecte, il sera immédiatement essayer d'obtenir un emplacement.
Si votre activité est en effet le premier client pour se connecter et getLastLocation() est appelée tout de suite dans onConnected(), qui pourrait ne pas être assez de temps pour le premier emplacement d'arriver..
Alors vous êtes réglage
mLocationRequest.setFastestInterval(30000);
qui signifie en fait que 30 secondes. ainsi, au moins 30 secondes après et généralement en fonction de votre réglage de temps préféré est de 120 secondes, n'est-il pas un temps très long si il n'est pas stocké dernier emplacement connu de tous? de plus, vous définissez la batterie équilibré priorité, ce qui va vous faire attendre plus longtemps.Je vous suggère de lancer des application Maps d'abord, alors qu'il y a au moins quelques confirmé emplacement, puis de tester votre application.
Si elle renvoie la valeur null, ce qui signifie que vous devez commencer à recevoir de l'emplacement des mises à jour avec LocationServices.FusedLocationApi.requestLocationUpdates avant de récupérer l'emplacement.
Pour moi, une solution au problème a été d'appeler le:
LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient,locationRequest, this);
avant l':
App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient));
Le problème est que le dernier emplacement n'existe pas donc c'est nul.
Si le problème persiste, essayez ceci:
Vérifier les autorisations nécessaires.
Vous assurer que vous avez activé sur votre appareil, puis redémarrer.
Probablement, votre problème est de savoir où vous vous connectez au client, je ne peux pas tester maintenant, mais comme google doc montre dans l'exemple, vous devez connecter le client dans votre
onStart()
méthode dans l'activité.Pour moi, ce getLocation travail
J'ai utilisé FusedAPI et code ci-Dessous fonctionne pour moi... Test Réel de l'appareil
De La Classe Helper
Peut Aider
Avec android
APILEVEL
au-dessus de 23 vous avez besoin d'un moment de l'exécution des autorisations. Le service de localisationACCESS_COARSE_LOCATION
,ACCESS_FINE_LOCATION
sont également besoin d'autorisations.Caisse documentation https://developer.android.com/training/permissions/requesting.html
C'est la solution exacte. Mais je voulais ajouter un peu d'explication des mesures de sorte que tout le monde obtient exactement les concepts. Pourquoi il est de retour nul, je suis d'accord pour suivre Amit K répondre. Mais, pour garantir sur la prévention de l'emplacement NullPointerException, vous commencez votre emplacement de transformation à l'intérieur de onLocationChanged() de rappel.
1) onCreate() de Android Composant (par exemple, Activité, Fragment ou Service. Remarque: ne Pas IntentService), construire et puis connecter la GoogleApiClient comme ci-dessous.
où, buildGoogleApiClient() de la mise en œuvre est,
Plus tard onDestroy(), vous pouvez vous déconnecter GoogleApiClient que,
L'étape 1 permet de construire et de connecter le GoogleApiClient.
1) GoogleApiClient instance première fois est connecté sur la méthode onConnected(). Maintenant, votre prochaine étape devrait ressembler onConnected() la méthode.
Ci-dessus, vous avez appelé une méthode createLocationRequest() pour créer de la demande de localisation. La méthode createLocationRequest() ressemble à ci-dessous.
3) Maintenant, onLocationChange() rappel: locationlistener de l'interface, vous obtenez un nouvel emplacement.
Vous obtenez le résultat de ce genre dans le Logcat:
03-22 18:34:17.336 817-817/com.LiveEarthquakesAlerts I/LocationTracker: emplacement: Emplacement[fusionné 37.421998,-122.084000 acc=20 et=+15m35s840ms alt=0.0]
Remarque: L'emplacement au-dessus de a, c'est Google, le Siège de l'emplacement, bien que je suis dans l'Arkansas. Cela se produit lorsque vous utilisez l'Émulateur. Sur le périphérique réel, il indique l'adresse correcte.
Pour être en mesure de faire ces trois étapes, vous devez avoir configuré votre build.gradle comme ci-dessous:
J'ai été confronté au même problème. Dans mon cas, le problème a été d'autoriser les autorisations de l'application.
J'avais refusé l'EMPLACEMENT parfait de l'autorisation qui a été demandé lors de la première application a démarré.
Travaillé dans mon cas !!
J'ai trouvé la solution.
J'ai été le tester mon application sur un téléphone avec l'API 22 et il a bien fonctionné, cependant, sur l'API 17 emplacement cesse de revenir
null
.Comme il s'avère, vous devez permettre à votre téléphone pour utiliser les services de localisation de google. Vous pouvez le faire en allant à
Settings->Location Access->Check the "WLAN & mobile network location"
(il peut être appelé différente dans un autre API). Sa description est: est-ceEn l'activant, j'ai soudain commencé à avoir beaucoup besoin de fusibles emplacement des données.
Espérons que cette aide!
Je ne pense pas que c'est un enjeu de codage.
Semble que l'emplacement de l'appareil fournisseur ayant des difficultés à repérer l'emplacement sur la proposition de temps, et locationChanged() la méthode n'est jamais appelée.
Vérifier si la configuration de l'appareil pour les services de localisation n'est pas sélectionnée avec un dur de dur à l'emplacement de mode (comme le GPS uniquement).
Si oui, votre code ne peut pas déterminer votre position par GPS si vous êtes à l'intérieur (que je suppose que vous êtes). Choisissez l'option Haute Précision et vos problèmes seront résolus.
Essayer cela,
Vérifier dans votre appareil si vous avez permis à l'emplacement ou pas.
Vous pouvez l'activer à partir de Panneau de Notification ou de Paramètres comme:
J'ai utilisé seulement une autorisation qui est :
Mon code de travail est:
étaient confrontés au même problème il y a 30min, le code en cours d'exécution avant nouveau simulateur.
Après la modification de la lat gnl de simulateur, il a commencé à travailler à nouveau
Je viens de faire une découverte, peut-être que ça aidera certains d'entre vous. J'étais nulle à partir de getLastLocation() et il s'avère que c'était parce que j'ai essayé d'obtenir l'emplacement uniquement avec le GPS activé, mais apparemment vous aussi, vous devez disposer d'une connexion Wi-Fi activé (même si pas connecté à un réseau).
Je me demande si c'est mon appareil de défaut (Samsung tablette)... je suis en train de faire plus de creuser le sujet, mais comme pour l'instant rien trouvé. Je vous serais reconnaissant de toute personne qui partage plus de connaissances sur cette question.