1

J'ai un problème avec mon application sur Android. J'utilise cette classe:Comment puis-je obtenir l'emplacement actuel

package com.example.seadog.gps; 

import android.app.AlertDialog; 
import android.app.Service; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.provider.Settings; 

import org.json.JSONObject; 

public class GPSTracker extends Service implements LocationListener { 

    private Context mContext; 

    public GPSTracker() { 

    } 

    boolean isGPSEnabled = false; 

    boolean isNetworkEnabled = false; 

    boolean canGetLocation = false; 

    Location location; 
    double latitude; 
    double longitude; 

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; 

    private static final long MIN_TIME_BW_UPDATES = 5000; 

    protected LocationManager locationManager; 

    public GPSTracker(Context context) { 
     this.mContext = context; 
     getLocation(); 
    } 

    public Location getLocation() { 
     try { 
      locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); 

      isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

      isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      if (!isGPSEnabled && !isNetworkEnabled) { 

      } else { 

       this.canGetLocation = true; 

       if (isNetworkEnabled) { 
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

        if (locationManager != null) { 
         location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 

       if (isGPSEnabled) { 

        if (location == null) { 
         locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

         if (locationManager != null) { 
          location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
          if (location != null) { 
           latitude = location.getLatitude(); 
           longitude = location.getLongitude(); 
          } 
         } 
        } 
       } 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return location; 
    } 

    public void stopUsingGPS(){ 
     if(locationManager != null){ 
      locationManager.removeUpdates(GPSTracker.this); 
     } 
    } 

    public double getLatitude(){ 
     if(location != null){ 
      latitude = location.getLatitude(); 
     } 

     return latitude; 
    } 

    public double getLongitude(){ 
     if(location != null){ 
      longitude = location.getLongitude(); 
     } 

     return longitude; 
    } 

    public boolean canGetLocation() { 
     return this.canGetLocation; 
    } 


    public void showSettingsAlert() { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

     alertDialog.setTitle("GPS jest wyłączony"); 

     alertDialog.setMessage("Do używania tej aplikacji wymagany jest GPS. W tym celu przejdź do ustawień, włącz GPS a następnie uruchom ponownie."); 

     alertDialog.setPositiveButton("Ustawienia", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog,int which) { 
       Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       mContext.startActivity(intent); 
       System.exit(0); 
      } 
     }); 

     alertDialog.setNegativeButton("Anuluj", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
       System.exit(0); 
      } 
     }); 


     alertDialog.show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 

     int ID = GlobalConfig.ID; 
     int Random = GlobalConfig.Random; 

     double latitude = location.getLatitude(); 
     double longitude = location.getLongitude(); 

     try { 

      JSONObject json = new JSONObject(); 
      json.put("ID", ID); 
      json.put("Random", Random); 
      json.put("latitude", latitude); 
      json.put("longitude", longitude); 

      GlobalConfig config = new GlobalConfig(); 
      config.set(json); 
      //config.i(0); 

     } catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     System.exit(0); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

} 

Cette classe est prise d'Internet. J'ai ajouté le code propre dans OnChangedLocation. Lorsque les coordonnées changent, créez un JSONObject avec la nouvelle latitude et la nouvelle longitude dans la classe GlobalConfig. Dans une autre classe, il existe un service qui envoie des données au serveur toutes les 5 secondes en arrière-plan. Mon problème est que la latitude et la longitude ne sont pas correctes. Parfois, la valeur obtenue est juste et l'autre fois non. L'emplacement reste le même pendant environ 10 ou quelques minutes et après un certain temps, la valeur correcte est affichée. Mon application fonctionne en arrière-plan. Sur le navigateur j'ai eu un aperçu sur google map et mon marqueur saute sur la carte. Je l'ai testé en conduisant une voiture.

Quelque chose ne va pas. Je voudrais obtenir la latitude et la longitude correctes. Aidez-moi!

+0

Ce type de question déjà posée –

+0

Vous devriez utiliser la fonction de recherche et regarder le manuel de Google [API Guides] (http://developer.android.com/guide/topics/location/strategies.html) –

+0

Possible dupliquer de [Obtenir la position d'un téléphone Android en utilisant le GPS] (http://stackoverflow.com/questions/2651499/getting-the-position-of-an-android-phone-by-using-gps) –

Répondre

2

Vous devez utiliser la dernière API Google pour la localisation. Tout d'abord, vous vous connectez avec cette API comme ceci:

GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) 
        .addApi(LocationServices.API) 
        .addConnectionCallbacks(locationClientCallback) 
        .addOnConnectionFailedListener(locationClientCallback) 
        .build(); 

if (!(googleApiClient.isConnected() || googleApiClient.isConnecting())) { 
     googleApiClient.connect(); 
} 

Maintenant, dans votre locationClientCallback vous recevez si l'API est connecté ou non.

private class LocationClientCallback implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

     @Override 
     public void onLocationChanged(Location location) { 
      if (location == null) { 
       return; 
      } 

      // YOU HAVE YOUR POSITION 

     } 

     @Override 
     public void onConnectionFailed(ConnectionResult arg0) { 
      // CONNECTION FAILED 
     } 

     @Override 
     public void onConnected(Bundle arg0) { 
      // GOOGLE API CONNECTED 


      // MAKE A REQUEST FOR LOCATIONS 
      LocationRequest request = LocationRequest.create(); 
      request.setSmallestDisplacement(0); 
      request.setInterval(5000); 
      request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
      LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, request, this); 

     } 

     @Override 
     public void onConnectionSuspended(int i) { 
      // CONNECTION SUSPENDED 

     } 


    } 

Et dans les rappels vous recevez les positions et autres événements. Dans l'événement onConnected, vous devez demander des emplacements à Google API Client.

Espérons que cela vous aide !!

+0

Je veux dire que ce n'est pas le cas. Je crée une application pour les conducteurs. Mon application fonctionne en arrière-plan, même lorsque l'application est masquée ou qu'un smartphone est en mode veille. Toutes les 5 secondes, un appareil envoie une donnée au serveur avec un emplacement mais voici un problème. Cet emplacement est erroné. Seulement parfois est correct. Je veux seulement la latitude et la longitude correctes dans ma base de données puis je dépose ces articles sur la carte de google sur le site Web. – SeaDog

+0

La façon correcte d'obtenir des emplacements est la suivante. Ce code que vous devez exécuter dans un service. À l'endroit où vous avez eu un champ qui indique l'exactitude de l'emplacement, Si la précision est très élevée, vous pouvez exclure la position. –

+0

Je vais vous dire que je ne sais pas comment l'utiliser. J'ai une bibliothèque marquée en rouge. Puis-je avoir une clé API de google et si j'ai un GPSTracker, dois-je l'enlever et créer une nouvelle classe LocationClientCallback avec des outils ...? – SeaDog