2012-01-25 24 views
44

Estoy tratando de obtener la ubicación actual de los usuarios utilizando el LocationManager. He investigado mucho y parece que no puedo encontrar a nadie con el mismo problema. La devolución de llamada OnLocationChanged nunca parece ser llamada. A continuación se muestra mi código variado y el logcat.OnLocationChanged de devolución de llamada nunca se llama

protected LocationListener locationListener; 
protected LocationManager locationManager; 
protected Context context; 

Mi método OnCreate()

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.v(TAG, "IN ON CREATE"); 

    this.context = getActivity(); 

    registerLocationUpdates(); 
} 

Mi método registerLocationUpdates

void registerLocationUpdates() { 
    Criteria criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_LOW); 
    criteria.setPowerRequirement(Criteria.POWER_LOW); 
    criteria.setAltitudeRequired(false); 
    criteria.setBearingRequired(false); 

    locationManager = (LocationManager)getActivity().getSystemService(LOCATION_SERVICE); 

    provider = locationManager.getBestProvider(criteria, true); 

    // Cant get a hold of provider 
    if (provider == null) { 
     Log.v(TAG, "Provider is null"); 
     showNoProvider(); 
     return; 
    } else { 
     Log.v(TAG, "Provider: " + provider); 
    } 

    locationListener = new MyLocationListener(); 

    locationManager.requestLocationUpdates(provider, 1L, 1f, locationListener); 

    // connect to the GPS location service 
    Location oldLocation = locationManager.getLastKnownLocation(provider); 

    if (oldLocation != null) { 
     Log.v(TAG, "Got Old location"); 
     latitude = Double.toString(oldLocation.getLatitude()); 
     longitude = Double.toString(oldLocation.getLongitude()); 
     waitingForLocationUpdate = false; 
     getNearbyStores(); 
    } else { 
     Log.v(TAG, "NO Last Location found"); 
    } 
} 

Mis LocationListener

private class MyLocationListener implements LocationListener { 

    public void onLocationChanged(Location location) { 
     latitude = Double.toString(location.getLatitude()); 
     longitude = Double.toString(location.getLongitude()); 

     Log.v(TAG, "IN ON LOCATION CHANGE"); 

     if (waitingForLocationUpdate) { 
      getNearbyStores(); 
      waitingForLocationUpdate = false; 
     } 

     locationManager.removeUpdates(this); 
    } 

    public void onStatusChanged(String s, int i, Bundle bundle) { 
     Log.v(TAG, "Status changed: " + s); 
    } 

    public void onProviderEnabled(String s) { 
     Log.e(TAG, "PROVIDER DISABLED: " + s); 
    } 

    public void onProviderDisabled(String s) { 
     Log.e(TAG, "PROVIDER DISABLED: " + s); 
    } 
} 

Mis permisos en la AndroidMa nifest

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

Y, finalmente, el Logcat después de ejecutar mi aplicación

01-25 09:43:10.963: VERBOSE/NearbyListFragment(3060): IN ON CREATE 
01-25 09:43:10.963: VERBOSE/LocationManagerService(1329): getProviders 
01-25 09:43:10.963: VERBOSE/LocationManagerService(1329): getProviders 
01-25 09:43:10.973: VERBOSE/LocationManagerService(1329): getProviders 
01-25 09:43:10.983: VERBOSE/NearbyListFragment(3060): Provider: gps 
01-25 09:43:10.983: DEBUG/LocationManager(3060): requestLocationUpdates: provider = gps, listener = co.fusionweb.[email protected]46ef4680 
01-25 09:43:10.983: DEBUG/GpsLocationProvider(1329): setMinTime 1 
01-25 09:43:10.983: VERBOSE/NearbyListFragment(3060): NO Last Location found 
01-25 09:43:10.983: VERBOSE/LocationManagerService(1329): _requestLocationUpdates: listener = Receiver{47421e68 Listener [email protected]} 
01-25 09:43:11.003: VERBOSE/countingFragment(3060): IN ON CREATE VIEW 
01-25 09:43:11.003: WARN/GpsLocationProvider(1329): Duplicate add listener for co.fusionweb.dealsplus 
01-25 09:43:11.013: VERBOSE/ScrollListener(3060): In Constructor 
01-25 09:43:11.013: VERBOSE/ScrollListener(3060): Scrolling 
01-25 09:43:11.033: DEBUG/GpsLocationProvider(1329): startNavigating 
01-25 09:43:11.043: DEBUG/lib_locapi(1329): loc_eng_set_qos_time_out(standalone = 60, agps = 89) 
01-25 09:43:11.043: DEBUG/lib_locapi(1329): loc_eng_set_qos_accuracy(accuracy = 50) 
01-25 09:43:11.043: VERBOSE/lib_locapi(1329): persist.radio.agps.mode: [] 
01-25 09:43:11.043: DEBUG/lib_locapi(1329): loc_eng_set_position mode, client = 1, interval = 1, mode = 1 
01-25 09:43:11.043: VERBOSE/lib_locapi(1329): loc_eng_ioctl called: client = 1, ioctl_type = 2 
01-25 09:43:11.043: VERBOSE/locapi_rpc_glue(1329): loc_ioctl 
01-25 09:43:11.043: DEBUG/RPC(1329): written RPC packet size: [96] 
01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet 
01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet size: [28] 
01-25 09:43:11.043: VERBOSE/locapi_rpc_glue(1329): loc_api_sync_ioctl: select_id = 0, loc_ioctl returned 0 
01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet 
01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet size: [80] 
01-25 09:43:11.043: VERBOSE/locapi_rpc_glue(1329): Callback received: 80 (cb_id=0x5310000 handle=1) 
01-25 09:43:11.043: DEBUG/RPC(1329): written RPC packet size: [28] 
01-25 09:43:11.043: VERBOSE/lib_locapi(1329): loc_eng_ioctl result: client = 1, ioctl_type = 2, SUCCESS 
01-25 09:43:11.043: DEBUG/lib_locapi(1329): loc_eng_start 
01-25 09:43:11.043: DEBUG/locapi_rpc_glue(1329): loc_start_fix 
01-25 09:43:11.043: DEBUG/RPC(1329): written RPC packet size: [44] 
01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet 
01-25 09:43:11.053: DEBUG/RPC(1329): read RPC packet size: [28] 
01-25 09:43:11.103: DEBUG/RPC(1329): read RPC packet 
01-25 09:43:11.103: DEBUG/RPC(1329): read RPC packet size: [80] 
01-25 09:43:11.113: VERBOSE/locapi_rpc_glue(1329): Callback received: 100 (cb_id=0x5310000 handle=1) 
01-25 09:43:11.113: VERBOSE/lib_locapi(1329): process_deferred_action: pthread_cond_wait returned 
01-25 09:43:11.113: DEBUG/lib_locapi(1329): loc_eng_report_status: GPS_STATUS_SESSION_BEGIN 
01-25 09:43:11.113: DEBUG/lib_locapi(1329): loc_eng_report_status: update status 
01-25 09:43:11.113: VERBOSE/GpsLocationProvider(1329): reportStatus status: 1 
01-25 09:43:11.113: DEBUG/GpsLocationProvider(1329): Acquiring wakelock 
01-25 09:43:11.123: DEBUG/RPC(1329): written RPC packet size: [28] 
01-25 09:43:11.183: DEBUG/PowerManagerService(1329): New lightsensor value:40, lcdValue:77 
01-25 09:43:11.273: DEBUG/RPC(1329): read RPC packet 
01-25 09:43:11.273: DEBUG/RPC(1329): read RPC packet size: [80] 
01-25 09:43:11.273: VERBOSE/locapi_rpc_glue(1329): Callback received: 100 (cb_id=0x5310000 handle=1) 
01-25 09:43:11.273: VERBOSE/lib_locapi(1329): process_deferred_action: pthread_cond_wait returned 
01-25 09:43:11.273: DEBUG/lib_locapi(1329): loc_eng_report_status: GPS_STATUS_ENGINE_ON 
01-25 09:43:11.273: DEBUG/lib_locapi(1329): loc_eng_report_status: update status 
01-25 09:43:11.273: VERBOSE/GpsLocationProvider(1329): reportStatus status: 3 

Y las partes ubicación SDK de Android de la Logcat mantenerlos repitiendo mismos. He intentado todo lo que puedo pensar y he visto en google y stackoverflow. Al igual que una nota al margen, he podido hacer que funcione en un dispositivo 2.3 utilizando el requestSingleUpdate que está disponible en API 9 y siguiendo la guía A Deep Dive into Location, pero necesito que funcione en 2.1 o 2.2 y superior con el viejo SDK . ASÍ si tienes alguna pista o quieres saber más, por favor avísame. Gracias por adelantado.

+0

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

Respuesta

46

Parece que la configuración debería funcionar, ya que no es así, haría su ejemplo lo más simple posible para solucionar los problemas. Me gustaría hacer que su solicitud se vea como

requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 
requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 

De esta manera se obtienen TODAS las actualizaciones posibles. Y comente la parte sobre cómo obtener la última ubicación conocida. No es necesario todavía.

Luego, en onLocationChanged(), simplemente tienen

Log.v(TAG, "IN ON LOCATION CHANGE, lat=" + latitude + ", lon=" + longitude); 

comentario a cabo el resto de modo que mantenga su oyente activo. Esto debería darle una secuencia de actualizaciones en un dispositivo real. En el emulador, deberá usar DDMS, y obtendrá una actualización de GPS cada vez que presione enviar.

+1

Eso casi funcionó, bueno, pensé que funcionaba porque funcionaba en el MyTouch 4G, seguí recibiendo actualizaciones después de la actualización. Luego probé con otro dispositivo (MyTouch 3G) y ya no funcionó. Me di cuenta de que en dispositivos mejores, como Bionic, el GPS funciona muy rápido, pero en los teléfonos de gama baja parece que nunca puedo hacerlo funcionar. ¿Los teléfonos de gama baja son tan malos en el GPS? o hay algo más que me estoy perdiendo? – smitt04

+1

La simplificación ayudó, pero también resultó que en el MyTouch 3G que no pude conseguir una posición hasta que me conecté a una red WiFi primero – smitt04

+11

esto no hace ninguna diferencia – user724861

2

Como escribió Steve Blackwell, su configuración es buena. Lo que puede intentar es entender si usted 100% tiene una señal fija de GPS! He instalado un buen GPS Tester application (from the play store) y le mostrará si tiene una solución o no, a qué satélites está conectado y cuál es la intensidad de la conexión. Esta fue la razón por la que mi OnLocationChanged() nunca llamó ... Intenté ejecutarlo desde un edificio: \

¡buena suerte!

+1

Gracias por compartir esa increíble aplicación, la instalé y supe que en algunos lugares mi ubicación gps es no se actualiza automáticamente (en mi aplicación) –

+0

No funciona para sony 4.3 –

+2

Impresionante herramienta, esa aplicación de prueba de GPS, por lo que puedo ver que en mi dispositivo muestra GPS: NO reparación. Supongo que esto significa que no hay una señal GPS fija, ¿verdad? – cubycode

0

Me enfrenté al mismo problema. Obtenía getLastKnownLocation como nulo. El problema se resuelve cuando reinicié el dispositivo y el servicio de ubicación en el dispositivo.

+0

Me enfrenté al mismo problema pero me di cuenta de que algunos dispositivos también requieren tiempo/movimiento para buscar la ubicación lat-lon ... mi nexo no estaba buscando el lat-lon mientras moto podía buscar –

6

Sustitución

LocationManager.GPS_PROVIDER

con

LocationManager.NETWORK_PROVIDER

resolvió mi problema.

Aquí es fragmento de código de mi gerente de locación

LocationManager locationManager = (LocationManager) getActivity().getSystemService(LOCATION_SERVICE); 

// Compruebe los permisos de ubicación, y por encima de malvavisco

 if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
       && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 

      Toast.makeText(getActivity(), "Not Enough Permission", Toast.LENGTH_SHORT).show(); 
      return; 
     } 

// Obtener la ubicación actual a comenzar con

 Location myLocation = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER); 

     currentLatitude = myLocation.getLatitude(); 
     currentLongitude = myLocation.getLongitude(); 

// Solicitar actualización de ubicación usando LocationManager.NETWORK_PROVIDER

 locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
       MIN_TIME_BW_UPDATES, 
       MIN_DISTANCE_CHANGE_FOR_UPDATES, MapFragment.this); 
1

Tuve un problema similar. Tenía los permisos solicitados para el servicio correctamente, pero no llegó ninguna actualización. Resultó que todo lo que tenía que hacer era simplemente esperar. Mientras buscaba el problema en Internet, ejecuté la aplicación y después de unos minutos comenzó a recibir actualizaciones. Entonces, incluso cuando maté la aplicación y la volví a ejecutar, las actualizaciones llegaron instantáneamente. Supongo que es algo del sistema, algo de optimización, tal vez debido a que el dispositivo no se movía del todo (por cierto, no es un dispositivo de mierda). , es Pixel).

1

Tuve la misma situación, pensé que había cometido un error en mi código por lo que el método onlocationchage no se está llamando, finalmente lo resolví así.

Step 1 : 
Close your application and Open Google Map Application. 

Step 2 : 
Touch the location finder button or icon over the Google Map app then It will show, currently where you are located. 

Step 3 : 
Now Run your app and check onlocationchage will call. 
2

Proveedor GPS inhabilitará cuando el dispositivo de baja potencia o utilizar el modo economizador entonces en ese caso no podemos recibir onLocationChanged

Proveedor GPS casi nunca volver la ubicación si se queda dentro de la casa o edificio (sólo funciona bien en exterior)

por lo tanto, en mi aplicación voy a utilizar tanto GPS_PROVIDERNETWORK_PROVIDER y recibir onLocationChanged() mejor

https://developer.android.com/guide/topics/location/strategies.html#Updates

para solicitar las actualizaciones de localización desde el proveedor de GPS, utilice GPS_PROVIDER en lugar de NETWORK_PROVIDER. También puede solicitar actualizaciones de ubicación desde el GPS y el Proveedor de ubicación de red llamando al requestLocationUpdates() dos veces: una vez para NETWORK_PROVIDER y una vez para GPS_PROVIDER.

0

Si usted está tratando con NETWORK_PROVIDER, es muy difícil de probar:

  • el emulador: Nunca trabaje
  • en el dispositivo real: sólo se getLastKnownLocation() funciona, para recibir onLocationChanged(), usted tiene que utilizar los datos móviles y salir a la calle con el riesgo de perder telefónica de ladrón: P

supongo que la razón es que sólo la ubicación del proveedor de red no sólo su propio dispositivo, y el netwo El proveedor de rk nunca se mueve, por lo que onLocationChanged() nunca llama. Puede suceder solo al cambiar entre datos móviles y wifi y viceversa. Por favor, corríjame si estoy equivocado.

Así que sugiero usar GPS_PROVIDER para experimentar antes de considerar el rendimiento y el uso de la batería. Funciona muy bien tanto en emuladores como en dispositivos reales. Para la mejor práctica: https://developer.android.com/guide/topics/location/strategies.html

Me llevó varias horas probar con NETWORK_PROVIDER sin ningún resultado, así que espero que mi sugerencia sea útil.

0

Tuve el mismo problema (onLocationChanged() nunca me llamó con NETWORK_PROVIDER) en mi dispositivo real (M, targetSDK 23 de la aplicación) hasta que lo reinicié.

Cuestiones relacionadas