在我的应用程序中,我在打开应用程序时获得了当前位置的纬度和经度,但是在关闭应用程序时却没有得到。
我正在使用Service类在应用程序中获取当前位置的纬度和经度。
请告诉我即使关闭应用程序也如何获取当前位置的纬度和经度
几个月前,我创建了GPSTracker库来帮助我获取GPS位置。如果您需要查看GPSTracker> getLocation
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
活动
import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { TextView textview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.geo_locations); // check if GPS enabled GPSTracker gpsTracker = new GPSTracker(this); if (gpsTracker.getIsGPSTrackingEnabled()) { String stringLatitude = String.valueOf(gpsTracker.latitude); textview = (TextView)findViewById(R.id.fieldLatitude); textview.setText(stringLatitude); String stringLongitude = String.valueOf(gpsTracker.longitude); textview = (TextView)findViewById(R.id.fieldLongitude); textview.setText(stringLongitude); String country = gpsTracker.getCountryName(this); textview = (TextView)findViewById(R.id.fieldCountry); textview.setText(country); String city = gpsTracker.getLocality(this); textview = (TextView)findViewById(R.id.fieldCity); textview.setText(city); String postalCode = gpsTracker.getPostalCode(this); textview = (TextView)findViewById(R.id.fieldPostalCode); textview.setText(postalCode); String addressLine = gpsTracker.getAddressLine(this); textview = (TextView)findViewById(R.id.fieldAddressLine); textview.setText(addressLine); } else { // can't get location // GPS or Network is not enabled // Ask user to enable GPS/network in settings gpsTracker.showSettingsAlert(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.varna_lab_geo_locations, menu); return true; } }
GPS追踪器
import java.io.IOException; import java.util.List; import java.util.Locale; import android.app.AlertDialog; import android.app.Service; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.location.Address; import android.location.Geocoder; 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; /** * Create this Class from tutorial : * http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial * * For Geocoder read this : http://stackoverflow.com/questions/472313/android-reverse-geocoding-getfromlocation * */ public class GPSTracker extends Service implements LocationListener { // Get Class Name private static String TAG = GPSTracker.class.getName(); private final Context mContext; // flag for GPS Status boolean isGPSEnabled = false; // flag for network status boolean isNetworkEnabled = false; // flag for GPS Tracking is enabled boolean isGPSTrackingEnabled = false; Location location; double latitude; double longitude; // How many Geocoder should return our GPSTracker int geocoderMaxResults = 1; // 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; // Store LocationManager.GPS_PROVIDER or LocationManager.NETWORK_PROVIDER information private String provider_info; public GPSTracker(Context context) { this.mContext = context; getLocation(); } /** * Try to get my current location by GPS or Network Provider */ public void 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); // Try to get location if you GPS Service is enabled if (isGPSEnabled) { this.isGPSTrackingEnabled = true; Log.d(TAG, "Application use GPS Service"); /* * This provider determines location using * satellites. Depending on conditions, this provider may take a while to return * a location fix. */ provider_info = LocationManager.GPS_PROVIDER; } else if (isNetworkEnabled) { // Try to get location if you Network Service is enabled this.isGPSTrackingEnabled = true; Log.d(TAG, "Application use Network State to get GPS coordinates"); /* * This provider determines location based on * availability of cell tower and WiFi access points. Results are retrieved * by means of a network lookup. */ provider_info = LocationManager.NETWORK_PROVIDER; } // Application can use GPS or Network Provider if (!provider_info.isEmpty()) { locationManager.requestLocationUpdates( provider_info, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this ); if (locationManager != null) { location = locationManager.getLastKnownLocation(provider_info); updateGPSCoordinates(); } } } catch (Exception e) { //e.printStackTrace(); Log.e(TAG, "Impossible to connect to LocationManager", e); } } /** * Update GPSTracker latitude and longitude */ public void updateGPSCoordinates() { if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } /** * GPSTracker latitude getter and setter * @return latitude */ public double getLatitude() { if (location != null) { latitude = location.getLatitude(); } return latitude; } /** * GPSTracker longitude getter and setter * @return */ public double getLongitude() { if (location != null) { longitude = location.getLongitude(); } return longitude; } /** * GPSTracker isGPSTrackingEnabled getter. * Check GPS/wifi is enabled */ public boolean getIsGPSTrackingEnabled() { return this.isGPSTrackingEnabled; } /** * Stop using GPS listener * Calling this method will stop using GPS in your app */ public void stopUsingGPS() { if (locationManager != null) { locationManager.removeUpdates(GPSTracker.this); } } /** * Function to show settings alert dialog */ public void showSettingsAlert() { AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); //Setting Dialog Title alertDialog.setTitle(R.string.GPSAlertDialogTitle); //Setting Dialog Message alertDialog.setMessage(R.string.GPSAlertDialogMessage); //On Pressing Setting button alertDialog.setPositiveButton(R.string.action_settings, new DialogInterface.OnClickListener() { @Override 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(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertDialog.show(); } /** * Get list of address by latitude and longitude * @return null or List<Address> */ public List<Address> getGeocoderAddress(Context context) { if (location != null) { Geocoder geocoder = new Geocoder(context, Locale.ENGLISH); try { /** * Geocoder.getFromLocation - Returns an array of Addresses * that are known to describe the area immediately surrounding the given latitude and longitude. */ List<Address> addresses = geocoder.getFromLocation(latitude, longitude, this.geocoderMaxResults); return addresses; } catch (IOException e) { //e.printStackTrace(); Log.e(TAG, "Impossible to connect to Geocoder", e); } } return null; } /** * Try to get AddressLine * @return null or addressLine */ public String getAddressLine(Context context) { List<Address> addresses = getGeocoderAddress(context); if (addresses != null && addresses.size() > 0) { Address address = addresses.get(0); String addressLine = address.getAddressLine(0); return addressLine; } else { return null; } } /** * Try to get Locality * @return null or locality */ public String getLocality(Context context) { List<Address> addresses = getGeocoderAddress(context); if (addresses != null && addresses.size() > 0) { Address address = addresses.get(0); String locality = address.getLocality(); return locality; } else { return null; } } /** * Try to get Postal Code * @return null or postalCode */ public String getPostalCode(Context context) { List<Address> addresses = getGeocoderAddress(context); if (addresses != null && addresses.size() > 0) { Address address = addresses.get(0); String postalCode = address.getPostalCode(); return postalCode; } else { return null; } } /** * Try to get CountryName * @return null or postalCode */ public String getCountryName(Context context) { List<Address> addresses = getGeocoderAddress(context); if (addresses != null && addresses.size() > 0) { Address address = addresses.get(0); String countryName = address.getCountryName(); return countryName; } else { return null; } } @Override public void onLocationChanged(Location location) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public IBinder onBind(Intent intent) { return null; } }
注意 如果方法/答案不起作用。您需要使用官方的Google Provider: FusedLocationProviderApi 。