2016-12-04 3 views
1

Ich habe versucht, zu versuchen den aktuellen Standort in Android seit mehreren Tagen zu bekommen, aber ich habe noch keine Lösung gefunden.So erhalten Sie aktuelle Koordinaten/Standort in android

Ich weiß, es gibt ähnliche Themen in diesem Zusammenhang, aber in meinem Fall der Code hat es nicht funktioniert. Gibt es jemanden, der dieses Problem bereits gelöst hat und mir helfen kann?

Ich füge einige Tests hinzu, die ich gemacht habe. Hier ist die GPS-Tracker-Klasse.

package utility; 

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 android.util.Log; 

public class GPSTracker extends Service implements LocationListener { 


    private final Context mContext; 

    // flag for GPS status 
    boolean isGPSEnabled = false; 

    // flag for network status 
    boolean isNetworkEnabled = false; 

    // flag for GPS status 
    boolean canGetLocation = false; 

    Location location; // location 
    double latitude; // latitude 
    double longitude; // longitude 

    // The minimum distance to change Updates in meters 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1; // 10 meters 

    // The minimum time between updates in milliseconds 
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute 

    // Declaring a Location Manager 
    protected LocationManager locationManager; 

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

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

      // getting GPS status 
      isGPSEnabled = locationManager 
        .isProviderEnabled(LocationManager.GPS_PROVIDER); 

      // getting network status 
      isNetworkEnabled = locationManager 
        .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      if (!isGPSEnabled && !isNetworkEnabled) { 
       // no network provider is enabled 
      } else { 
       this.canGetLocation = true; 
       // First get location from Network Provider 
       if (isNetworkEnabled) { 
        try { 
         locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        } catch (SecurityException e) { 

        } 
        Log.d("Network", "Network"); 
        if (locationManager != null) { 

         try { 
          location = locationManager 
            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
         } catch (SecurityException e) { 

         } 

         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 
       // if GPS Enabled get lat/long using GPS Services 
       if (isGPSEnabled) { 
        if (location == null) { 

         try { 
          locationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 
            MIN_TIME_BW_UPDATES, 
            MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
          Log.d("GPS Enabled", "GPS Enabled"); 
          if (locationManager != null) { 
           location = locationManager 
             .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
           if (location != null) { 
            latitude = location.getLatitude(); 
            longitude = location.getLongitude(); 
           } 
          } 
         } catch (SecurityException s) { 

         } 

        } 
       } 
      } 

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

     return location; 
    } 

    /** 
    * Stop using GPS listener 
    * Calling this function will stop using GPS in your app 
    */ 
    public void stopUsingGPS() { 
     if (locationManager != null) { 
      try { 
       locationManager.removeUpdates(GPSTracker.this); 
      } catch (SecurityException e) { 

      } 

     } 
    } 

    /** 
    * Function to get latitude 
    */ 
    public double getLatitude() { 
     if (location != null) { 
      latitude = location.getLatitude(); 
     } 

     // return latitude 
     return latitude; 
    } 

    /** 
    * Function to get longitude 
    */ 
    public double getLongitude() { 
     if (location != null) { 
      longitude = location.getLongitude(); 
     } 

     // return longitude 
     return longitude; 
    } 

    /** 
    * Function to check GPS/wifi enabled 
    * 
    * @return boolean 
    */ 
    public boolean canGetLocation() { 
     return this.canGetLocation; 
    } 

    /** 
    * Function to show settings alert dialog 
    * On pressing Settings button will lauch Settings Options 
    */ 
    public void showSettingsAlert() { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

     // Setting Dialog Title 
     alertDialog.setTitle("GPS Settings"); 

     // Setting Dialog Message 
     alertDialog.setMessage("GPS is not active. Do you want to open?"); 

     // On pressing Settings button 
     alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       mContext.startActivity(intent); 
      } 
     }); 

     // on pressing cancel button 
     alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 

     // Showing Alert Message 
     alertDialog.show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

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

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

} 

Und ich instanziiert diese Klasse in meiner Tätigkeit wie folgt:

import android.os.Bundle; 
import android.app.Activity; 
import android.widget.ImageButton; 
import android.widget.TextView; 

import utility.GPSTracker; 


public class AroundMeActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_around_me); 

     TextView location_text = (TextView) findViewById(R.id.location_text); 

     GPSTracker gps; 
     double latitude = 0.0; 
     double longitude = 0.0; 

     gps = new GPSTracker(AroundMeActivity.this); 

     // check if GPS enabled 
     if(gps.canGetLocation()) 
     { 
      latitude = gps.getLatitude(); 
      longitude = gps.getLongitude(); 
     } 
     else 
     { 
      gps.showSettingsAlert(); 
     } 

     location_text.setText(latitude + " " + longitude); 

    } 
} 

Die Ergebnisse ist 0.0 sowohl für Breite und Länge.

Vielen Dank im Voraus Jungs !!!

+0

Der Fused Location Provider ist die empfohlene Methode, es sei denn, Sie haben einen Grund, die Google Play-Dienste zu meiden. (Sie möchten Ihre App zum Beispiel in China arbeiten.) Sie können die [offizielle Dokumentation] (https://developer.android.com/training/location/receive-location-updates.html) und [Beispiel in der Dokumentation lesen ] (http://stackoverflow.com/documentation/android/1837/location#t=201612041037447620643). Beachten Sie, dass 'getLastLocation()' 'null 'oder einen alten und irrelevanten Ort zurückgibt, daher ist es besser, Updates anzufordern. Sie können sie jederzeit stoppen, wenn Sie keine fortlaufenden Aktualisierungen benötigen. –

+0

Das ist nicht was ich gesucht habe. Er berechnet Standortaktualisierungen ausgehend von einem aktuellen Standort, aber ich müsste die aktuellen Koordinaten in einem bestimmten Moment abrufen. – Giulio

Antwort

0

Verwenden android LocationMannager

Kasse androidhive Tutorial über Android GPS, Location Manager loszulegen

+0

Ja, ich habe androidhive als erstes Tutorial überprüft und bin Schritt für Schritt gefolgt, aber es hat nicht funktioniert. – Giulio

+0

Nun, das ist, weil es ein schlechtes Tutorial ist. Ignoriere es einfach. (Weitere Details sind [in diesem Blogbeitrag] (http://gabeschansoftware.com/location-tracking/). –

+0

Ich werde beide wieder auschecken. Hat jemand von Ihnen versucht, etwas von diesem Code zu verwenden? – Giulio

0

hier eine große Bibliothek ist, sehr einfach zu bedienen und leicht: https://github.com/mrmans0n/smart-location-lib

Nur kompilieren es mit gradle und das ist es .

+0

Der Leitfaden ist nett, aber nach dem Kompilieren stürzt die App ab. Haben Sie einen Beispielcode, den ich in meiner App verwenden kann, um zu testen, wie die aktuellen GPS-Koordinaten abgerufen werden? – Giulio

+0

Nein, habe ich leider nicht mehr, ich habe es in der Vergangenheit benutzt. Aber das sollte ziemlich einfach sein, obwohl ich bei der Integration nicht helfen kann. Fragen Sie sie auf ihrem Github-Repository. – PaulRBerg

Verwandte Themen