Android location does not return location from user class

I have my own location class. I have a chance that when I search for a GPS location using my class, I get 0, 0 back.

If I look for the getLastKnown function in the location manager for GPS, I get a forced value:

public Location getGPSloc(Context c){ isGPSavailable(c); if(gps_enabled) lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, locationListenerGps); timerGPS = new Timer(); timerGPS.schedule(new GetLastLocationGPS(), 45000); return gpsLoc; } 

This is the class that I am calling from outside the function, I am using this.getApplicationContext () in the call. This is GetLastLocationGPS ():

  class GetLastLocationGPS extends TimerTask { @Override public void run() { lm.removeUpdates(locationListenerGps); if(gps_enabled){ gpsLoc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);} else{ gpsLoc = null; } } } 

Here is the listener:

  LocationListener locationListenerGps = new LocationListener() { @Override public void onLocationChanged(Location location) { timerGPS.cancel(); gpsLoc = location; lm.removeUpdates(this); } @Override public void onProviderDisabled(String provider) {} @Override public void onProviderEnabled(String provider) {} @Override public void onStatusChanged(String provider, int status, Bundle extras) {} }; 

When I call MyLocationInstance.getGPSloc (this.getApplicationContext ()), the return value is always 0, 0. I have a forced value of 43 43 that I sent to the emulator and appears when I connect to LocationManagerInstance.getLastKnownLocation (LM.GPS );

I do not know why this method will not get the location.

Is this because theoretically the timer still works when the call is in progress? This is the only way to get an answer. Any other ideas?

+1
source share
1 answer

I'm not sure what the problem is, but this is my code that is under load and fully functional.

Since this class extends from a fragment, it can act as the parent of your fragment. There is a listener that your class can get a new location after each interval.

 public class LocationFinderFragment extends Fragment implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener { public interface OnNewLocationFoundListener { public void OnNewLocationFound(Location location); } private static final String TAG = "LocationFinderFragment"; private static final long DEFAULT_UPDATE_LOCATION_INTERVAL = 30 * 1000; // update every 30 seconds private static final long DEFAULT_TERMINATE_SAT_FINDING = 1 * 60 * 60 * 1000; // for 1 hour private OnNewLocationFoundListener listener; // Listener of fragments private OnNewLocationFoundListener listener2; // Listener of MainFragmentHolder private Context context; private LocationClient mLocationClient; private static double lat = 0; private static double lng = 0; private static long lastTime = 0; private LocationListener mLocationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { if(location == null) return; if(lat == location.getLatitude() && lng == location.getLongitude()) { Log.e(TAG, "location not changed."); return; } lat = location.getLatitude(); lng = location.getLongitude(); Log.i(TAG, "Location changed to (" + lat + ", " + lng + ")"); // Ask fragment to get new data and update screen listener.OnNewLocationFound(location); // Display toast notification every minute (instead of every 30 seconds) DateTime time = new DateTime(); long currentTime = time.getMillis(); if(currentTime > lastTime + 1 * 60 * 1000) { listener2.OnNewLocationFound(location); lastTime = currentTime; } } }; @Override public void onAttach(Activity activity) { super.onAttach(activity); try { listener2 = (OnNewLocationFoundListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnNewLocationFoundListener interface."); } Log.i(TAG, "Fragment attached to activity."); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Getting context context = getActivity().getApplicationContext(); // Get location manager mLocationClient = new LocationClient(context, this, this); } @Override public void onResume() { super.onResume(); // Get location if(mLocationClient != null) mLocationClient.connect(); } @Override public void onPause() { super.onPause(); // remove listener in order to save resource if(mLocationClient != null) mLocationClient.disconnect(); } @Override public void onDestroy() { super.onDestroy(); // remove listener in order to save resource if(mLocationClient != null) mLocationClient.disconnect(); } @Override public void onConnected(Bundle bundle) { Log.i(TAG, "Location Connected."); // Get last known location Location lastLocation = mLocationClient.getLastLocation(); mLocationListener.onLocationChanged(lastLocation); if(!SpGodMode.isLocationModeEnabled(context)) { // Create location request LocationRequest locationRequest = LocationRequest.create() .setInterval(DEFAULT_UPDATE_LOCATION_INTERVAL) .setExpirationDuration(DEFAULT_TERMINATE_SAT_FINDING) .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); mLocationClient.requestLocationUpdates(locationRequest, mLocationListener); } else { String strLoc = SpGodMode.getLocation(context); if(strLoc != null) { String lat = strLoc.substring(0, strLoc.indexOf(",")); String lng = strLoc.substring(strLoc.indexOf(",") + 1); Location location = new Location(""); try { location.setLatitude(Double.parseDouble(lat)); location.setLongitude(Double.parseDouble(lng)); mLocationListener.onLocationChanged(location); } catch (NumberFormatException e) { Log.e(TAG, "Wrong lat/lng for parsing as Double."); Toast.makeText(context, "Wrong lat/lng", Toast.LENGTH_SHORT).show(); } } } } @Override public void onDisconnected() { Log.i(TAG, "Location Disconnected."); if(mLocationClient != null && mLocationClient.isConnected()) mLocationClient.removeLocationUpdates(mLocationListener); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.e(TAG, "Connection failed listener."); } public void setLocationListener(OnNewLocationFoundListener listener) { this.listener = listener; } public void disconnectLocation() { mLocationClient.disconnect(); } } 
0
source

Source: https://habr.com/ru/post/951859/


All Articles