studio programacion herramientas fundamentos con avanzado aplicaciones android gps locationmanager

programacion - manual de android en pdf



onLocationChanged() nunca llamado (6)

Estoy escribiendo un código que trae la ubicación actual pero no me está dando la ubicación porque nunca llama onLocationChanged() . Hay alguna manera de encontrar la ubicación.

mobileLocation está llegando a 0 para este caso, por lo que la ejecución va al bloque else.

Mi codigo es

public class FindLocation { private LocationManager locManager; private LocationListener locListener; private Location mobileLocation; private String provider; public FindLocation(Context ctx){ locManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE); locListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public void onLocationChanged(Location location) { System.out.println("mobile location is in listener="+location); mobileLocation = location; } }; locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener); if (mobileLocation != null) { locManager.removeUpdates(locListener); String londitude = "Londitude: " + mobileLocation.getLongitude(); String latitude = "Latitude: " + mobileLocation.getLatitude(); String altitiude = "Altitiude: " + mobileLocation.getAltitude(); String accuracy = "Accuracy: " + mobileLocation.getAccuracy(); String time = "Time: " + mobileLocation.getTime(); Toast.makeText(ctx, "Latitude is = "+latitude +"Longitude is ="+londitude, Toast.LENGTH_LONG).show(); } else { System.out.println("in find location 4"); Toast.makeText(ctx, "Sorry location is not determined", Toast.LENGTH_LONG).show(); } } }


¿Nunca obtienes una ubicación o solo cuando escribes en tu comentario "a veces se obtiene la ubicación pero no al momento de hacer clic"?

Puede ser que su código sea más rápido que el LocationManager, que aún no haya llamado onLocationChanged (). Cambie su código para obtener la última ubicación conocida, o espere hasta que llamen a locListener:

locManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 1000, 1, locListener); mobileLocation = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (mobileLocation != null) {


Creo que olvidaste el permiso

<uses-permission android:name="android.permission.ACCESS_GPS" /> <uses-permission android:name="android.permission.ACCESS_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" />

O

Declara la clase apropiada como

public class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location arg0) { latitude = arg0.getLatitude(); longitude = arg0.getLongitude(); } }


Directamente después de locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener) , agregue el siguiente código:

locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1, locListener);

EDIT: corrigió el código gracias al comentario de @Fabian Streitel.


Ejecuto mi aplicación en un dispositivo real. Uso red en lugar de GPS y onLocationChanged se llama:

locMan.requestSingleUpdate(LocationManager.NETWORK_PROVIDER, this, null);


En mi caso la aplicación no pedía permisos. Aunque he añadido los permisos en el archivo de manifiesto. Así que no pude permitir que mi aplicación acceda a la ubicación.

Como solución, fui a: Settings->Permissions->Your location y habilité el permiso de ubicación para mi aplicación en desarrollo. Y eso solucionó mi problema.

Supongo que este problema es solo cuando la aplicación se instala a través de Android Studio. Espero que no ocurra cuando la aplicación se instale desde Google Play.


import android.app.ActivityManager; import android.app.Service; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.media.AudioManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.os.IBinder; import android.os.PowerManager; import android.util.Log; import org.json.JSONObject; import java.util.List; public class AndroidLocationServices extends Service { PowerManager.WakeLock wakeLock; String MODULE="AndroidLocationServices",TAG=""; private LocationManager locationManager; double getLattitude=0,getLogitude=0; private static final long MIN_TIME_BW_UPDATES = 1; // 1 minute private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; public AndroidLocationServices() { // TODO Auto-generated constructor stub } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); preferences=getSharedPreferences(GlobalConfig.PREF_NAME, MODE_PRIVATE); PowerManager pm = (PowerManager) getSystemService(this.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DoNotSleep"); // Toast.makeText(getApplicationContext(), "Service Created", // Toast.LENGTH_SHORT).show(); Log.e("Google", "Service Created"); } @Override @Deprecated public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); Log.e("Google", "Service Started"); locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); //locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2500, 0, listener); locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, listener); } public LocationListener listener = new LocationListener() { @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub Log.e("Google", "Location Changed"); location.setAccuracy(100); if (location == null) return; getLattitude=location.getLatitude(); getLogitude=location.getLongitude(); Log.e("latitude", getLattitude + ""); Log.e("longitude", getLogitude + ""); } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } }; @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); // wakeLock.release(); } }

Manifiesto:

<service android:name=".services.AndroidLocationServices"/>

Iniciar el servicio antes de usar:

startService(new Intent(this, AndroidLocationServices.class));