经度和纬度GPSTracker Android总是返回0,0

休言女子非英物,夜夜龙泉壁上鸣。这篇文章主要讲述经度和纬度GPSTracker Android总是返回0,0相关的知识,希望能为你提供帮助。
我正在实施GPS追踪器,以获得http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial/的经度和纬度。
要获得经度和纬度值,我使用此代码:

gps = new GPSTracker(context); latitude_user= gps.getLatitude(); longitude_user= gps.getLongitude();

有些设备总是返回0,0值,对于某些设备它运行良好...那么如何解决它?
这是GPS Tracker.class
package com.tracking.bus.maps; 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 = 10; // 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; if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("Network", "Network"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } // if GPS Enabled get lat/long using GPS Services if (isGPSEnabled) { if (location == null) { 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 (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){ locationManager.removeUpdates(GPSTracker.this); } }/** * 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 is settings"); // Setting Dialog Message alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); // 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) { getLatitude(); getLongitude(); }@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; }}

【经度和纬度GPSTracker Android总是返回0,0】我已经在下面批准了
< uses-permission android:name="android.permission.INTERNET"/> < uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> < uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

答案你没有在onLocationChanged()中更新收到的位置,试试这个:
@Override public void onLocationChanged(Location location) { this.location = location; getLatitude(); getLongitude(); }

另一答案使用游戏服务
compile 'com.google.android.gms:play-services:11.0.4'

在android中更新lat的方法
public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener, ResultCallback< LocationSettingsResult> {private static final String TAG = MainActivity.class.getSimpleName(); private Context context; private MarshMallowPermission permission; protected static final int REQUEST_CHECK_SETTINGS = 0x1; public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 60000; public static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = UPDATE_INTERVAL_IN_MILLISECONDS / 2; private GoogleApiClient mGoogleApiClient; private LocationRequest mLocationRequest; private LocationSettingsRequest mLocationSettingsRequest; protected Boolean mRequestingLocationUpdates; protected Location mCurrentLocation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.yourxml); context = this; mRequestingLocationUpdates = false; permission = new MarshMallowPermission(context); buildGoogleApiClient(); createLocationRequest(); buildLocationSettingsRequest(); try { if (Build.VERSION.SDK_INT > = Build.VERSION_CODES.M) { if (permission.checkPermissionForLocation()) { Log.d(TAG, "Permissions Grant"); checkLocationSettings(); } else { permission.requestPermissionForLocation(); } } else { checkLocationSettings(); }} catch (Exception e) {}}@Override protected void onStart() { super.onStart(); mGoogleApiClient.connect(); }@Override public void onResume() { super.onResume(); if (mGoogleApiClient.isConnected() & & mRequestingLocationUpdates) { startLocationUpdates(); } }@Override protected void onPause() { super.onPause(); if (mGoogleApiClient.isConnected()) { stopLocationUpdates(); } }@Override protected void onStop() { super.onStop(); mGoogleApiClient.disconnect(); }protected synchronized void buildGoogleApiClient() { Log.i(TAG, "Building GoogleApiClient"); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); }protected void createLocationRequest() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); }protected void buildLocationSettingsRequest() { LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); builder.addLocationRequest(mLocationRequest); mLocationSettingsRequest = builder.build(); }protected void checkLocationSettings() { PendingResult< LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings( mGoogleApiClient, mLocationSettingsRequest ); result.setResultCallback(this); }protected void startLocationUpdates() { try { LocationServices.FusedLocationApi.requestLocationUpdates( mGoogleApiClient, mLocationRequest, this ).setResultCallback(new ResultCallback< Status> () { @Override public void onResult(Status status) { mRequestingLocationUpdates = true; } }); } catch (SecurityException e) { Log.i(TAG, e.getMessage()); }}protected void stopLocationUpdates() { LocationServices.FusedLocationApi.removeLocationUpdates( mGoogleApiClient, this ).setResultCallback(new ResultCallback< Status> () { @Override public void onResult(Status status) { mRequestingLocationUpdates = false; } }); }@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { // Check for the integer request code originally supplied to startResolutionForResult(). case REQUEST_CHECK_SETTINGS: switch (resultCode) { case Activity.RESULT_OK: Log.i(TAG, "User agreed to make required location settings changes."); startLocationUpdates(); case Activity.RESULT_CANCELED: Log.i(TAG, "User chose not to make required location settings changes."); break; } break; } }@Override public void onConnected(@Nullable Bundle bundle) { Log.d(TAG, "Connected"); }@Override public void onLocationChanged(Location location) { Log.d(TAG, "LocationChanged"); if (location != null) { mCurrentLocation = location; Log.d(TAG, "Latitude:" + location.getLatitude() + " " + "Longitude:" + location.getLongitude()); } }@Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {}@Override public void onConnectionSuspended(int i) {}@Override public void onResult(LocationSettingsResult locationSettingsResult) { final Status status = locationSettingsResult.getStatus(); switch (status.getStatusCode()) { case LocationSettingsStatusCodes.SUCCESS: Log.i(TAG, "All location settings are satisfied."); startLocationUpdates(); break; case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to" + "upgrade location settings "); try { status.startResolutionForResult(FindPartyActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException e) { Log.i(TAG, "PendingIntent unable to execute request."); } break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog " + "not created."); break; } }@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { Log.d(TAG, "requestCode---" + requestCode + "" + "grantResults----" + grantResults); switch (requestCode) { case MarshMallowPermission.LOCATION_PERMISSION_REQUEST_CODE: if (grantResults.length > 0 & & grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.d(TAG, "Permissions Grant"); checkLocationSettings();

    推荐阅读