ubicacion tiempo studio segundo real plano partir obtener hacer google geolocalizacion direccion coordenadas activar java android geolocation gps locationmanager

java - tiempo - La ubicación de Android no devuelve la ubicación de la clase personalizada



ubicacion en segundo plano android (1)

No estoy seguro de cuál es su problema, pero este es mi código que está bajo carga y es completamente funcional.

Como esta clase se extiende desde Fragment, puede actuar como padre de tu fragmento. Hay un oyente que su clase puede obtener una nueva ubicación después de cada intervalo.

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(); } }

Tengo mi propia clase de ubicación. Tengo un resultado de probabilidades de que cuando busco la ubicación del GPS usando mi clase, me devuelvan 0, 0.

Mientras que si busco la función getLastKnown en el administrador de ubicación para GPS, obtengo el valor forzado:

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; }

Esta es la clase a la que llamo desde fuera de la función, estoy usando this.getApplicationContext () en la llamada. Esto es GetLastLocationGPS ():

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

Aquí está el oyente:

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) {} };

Cuando llamo a MyLocationInstance.getGPSloc (this.getApplicationContext ()) el valor de retorno siempre es 0, 0. Tengo un valor forzado de 83 43 que envié al emulador y aparece si sub en LocationManagerInstance.getLastKnownLocation (LM.GPS) ;

No tengo idea de por qué este método no buscará la ubicación.

¿Es porque en teoría el temporizador todavía está funcionando cuando ocurre la llamada? Esa es la única forma en que puedo encontrar una respuesta. ¿Alguna otra idea?