-1

Bonne journée.Les mises à jour de l'emplacement du client Google Api ne fonctionnent pas et lastKnownLocation est NULL après la deuxième tentative

J'ai besoin d'obtenir l'emplacement chaque fois que l'application est lancée. Le rassemblement de lieux se passe à l'intérieur du fragment comme ça.

Je suis bulding client comme ceci.

mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
      // The next two lines tell the new client that “this” current class will handle connection stuff 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      //fourth line adds the LocationServices API endpoint from GooglePlayServices 
      .addApi(LocationServices.API) 
      .build(); 

    // Create the LocationRequest object 
    mLocationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_LOW_POWER); 


@Override 
public void onStart() { 
    super.onStart(); 
    if (mSharedHelper.showGreeting()) { 
     if (!mGoogleApiClient.isConnected()) { 
      mGoogleApiClient.connect(); 
     } 
    } 
} 

    @Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (mGoogleApiClient.isConnected()) { 
     mGoogleApiClient.disconnect(); 
    } 
} 

Le rappel onConnected est déclenchée et je fais la prochaine.

@Override 
public void onConnected(Bundle bundle) { 
    try { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
     Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     if (location == null) { 
      failedLocate = true; 
      hideGreetingCard(); 
     } else { 
      failedLocate = false; 
      //If everything went fine lets get latitude and longitude 
      currentLatitude = location.getLatitude(); 
      currentLongitude = location.getLongitude(); 
      YahooWeather yahooWeather = YahooWeather.getInstance(); 
      yahooWeather.queryYahooWeatherByLatLon(getActivity(), currentLatitude, currentLongitude, this); 
     } 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } 

} 

La question est que la variable d'emplacement est toujours nul, peu importe quelle priorité j'ai essayé tout ce que je ne faisais rien fonctionne, je suis toutes les autorisations ajouté à l'intérieur manifeste et demandé au moteur d'exécution en conséquence, et d'ailleurs variable d'emplacement étant null, le rappel onLocationChanged ne se déclenche jamais mais vous pouvez voir qu'à l'intérieur onConnected je demande la mise à jour de l'emplacement mais rien ne fonctionne simplement et non je n'ai pas besoin d'utiliser un type de carte pour forcer n'importe quel type de simulation J'ai juste besoin d'obtenir la longitude et la latitude de l'utilisateur à chaque fois que l'application est lancée et ce fragment est montré ce que je veux. Des idées?

+0

duplication possible: http://stackoverflow.com/questions/29441384/fusedlocationapi-getlastlocation-always-null –

+0

n'avez-vous pas lu mon message? N'avez-vous pas vu que je dis que je n'ai pas besoin d'invoquer une carte pour mettre à jour l'emplacement! –

+0

qui ne corrige pas le problème que j'ai –

Répondre

0

Le service de localisation n'est pas prêt immédiatement sur Connecté. Essayez d'ajouter un gestionnaire pour l'action postdelay. Obtenez l'emplacement 5 secondes après onConnected.

+0

pas une solution que les rappels ne se déclenche pas donc ce n'est pas le cas –

0

De la documentation de getLastLocation:

Renvoie le meilleur emplacement le plus récent actuellement disponible.

Si un emplacement n'est pas disponible, ce qui devrait se produire très rarement, la valeur null sera renvoyée. La meilleure précision disponible tout en respectant les autorisations de localisation sera renvoyée.

Lorsqu'un dernier emplacement est pas disponible, vous devez demander un vous-même comme ceci:

Déclarez une variable d'instance:

private LocationRequest mLocationRequest; 

Et onConnected faire (Ne pas oublier de mettre en œuvre LocationListener sur votre composant):

@Override 
    public void onConnected(Bundle bundle) { 
     Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     if (location == null) { 
      // Create the LocationRequest object 
      mLocationRequest = LocationRequest.create() 
        .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
        .setInterval(10 * 1000)  // 10 seconds, in milliseconds 
        .setFastestInterval(1 * 1000); // 1 second, in milliseconds 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
     } 
     else { 
      // Location is already available 
     } 
    } 

Vous recevrez l'emplacement onLocationChanged rappel:

@Override 
public void onLocationChanged(Location location) { 
    // Use the location 
} 

Vous devez appeler removeLocationUpdates lorsque vous devez recevoir des mises à jour de cesser de l'emplacement.

if (mGoogleApiClient.isConnected()) { 
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
    mGoogleApiClient.disconnect(); 
} 

Puisque vous avez besoin de l'emplacement une seule fois lorsque l'application est lancée, vous pouvez appeler cela dans le rappel onLocationChanged.

+0

ok je vais essayer cela mais avant que j'ai une question, je n'ai pas besoin de toute précieuse longitude et latitude donc le réseau de simplies fournira sera parfait car j'ai besoin de précieuses autour de la ville et non pas de la rue ou des compteurs, donc la plus grande dérive ne donnera pas un problème, fondamentalement je dis que j'ai vu que vous utilisez HIGH_ACCURACY, donc je peux utilisez le mode POWER_LOW au lieu de HIGH_ACCURACY et cela fonctionnera de la même façon? comme la haute précision nécessitera GPS et je ne veux pas que le GPS soit invoqué car le réseau est assez assez –

+0

Oui, il devrait fonctionner de la même manière, mais avec une précision moindre. –

+0

parfait, le tester maintenant –