2012-08-13 41 views
17

Estoy escribiendo un código que trae la ubicación actual pero no me da la ubicación porque nunca llama a onLocationChanged(). Es posible encontrar la ubicación.onLocationChanged() nunca se llamó

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

Mi código 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(); 
    } 
} 
    } 
+1

si marca Emulador o dispositivo? – rajeshwaran

+0

No, por primera vez en (máquina real también) cuando lo inicio, no llama a LocationChanged() por lo que la variable mobileLocation es nula. Significa que algunas veces obtiene ubicación pero no al momento del clic. –

+0

Aunque es muy tarde, pero espero que este comentario pueda ayudar a otra persona, consulte este enlace: http://www.lengrand.fr/2013/10/onlocationchanged-is-never-called-on-android – SMHJamali

Respuesta

5

¿Usted nunca tendrá una ubicación o solamente como tú Escribes en tu comentario "a veces se obtiene la ubicación pero no en el momento del clic".

Puede ser que su código sea más rápido que LocationManager, que aún no haya llamado a OnLocationChanged(). Cambiar el código con el fin de conseguir la última ubicación conocida, o esperar hasta que su locListener fue llamado:

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

I cosa que olvidó 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

Declarar la clase indicada como

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

} 
+0

Lo he hecho estas todas las cosas –

+0

dime cuando el método onLocationChanged() llamó ?? cuando se cambia la ubicación o cada vez que llamamos al oyente? –

8

corro mi aplicación en el dispositivo real. i el uso de la red en lugar de GPS y onLocationChanged se llama:

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

NETWORK_PROVIDER resolvió mi problema. Gracias :) – Mehmood

+0

Esto también funcionó para mí, si tienes la posibilidad de eleborar, por favor hazlo :) – jobbert

0

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: Se ha corregido el código gracias a la observación de @Fabian Streitel.

+0

locManager no es una función en tu ejemplo. No creo que tu código compile siquiera –

+0

@FabianStreitel, tienes razón, acabo de cometer un error estúpido al perder .requestLocationUpdates. Edité la respuesta –

0
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"/> 

de inicio del servicio antes de su uso:

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

En mi caso, la aplicación no era para solicitar los permisos. Aunque he agregado los permisos en el archivo de menifest. Así que no pude permitir que mi aplicación acceda a la ubicación.

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

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

Cuestiones relacionadas