Google maps api no coloca el marcador en la ubicación correcta

Mi código se supone para averiguar la ubicación de los usuarios y colocar un marcador en el mapa al entrar en la aplicación. Mi valor de ubicación siempre es igual a null y nunca recibe un valor.

if (location != null) { lat = (int) (location.getLatitude() * 1E6); longi = (int) (location.getLongitude() * 1E6); GeoPoint ourLocation = new GeoPoint(lat, longi); OverlayItem overlayItem = new OverlayItem(ourLocation, "AYO", "Whats good yo"); CustomPinpoint custom = new CustomPinpoint(d, CampusMap.this); custom.insertPinpoint(overlayItem); overlayList.add(custom); } else { Toast.makeText(CampusMap.this, "Couldn't get provider", Toast.LENGTH_SHORT).show(); } } 

He tenido un problema relativamente similar con un GPS RPG que estaba trabajando y aquí hay algunas cosas que me di cuenta:

En primer lugar, puede tomar un tiempo para que su ubicación inicialmente se encuentra, lo que causaría ese problema, ya que sólo está comprobando si la ubicación es nula.

También es posible que desee asegurarse de que los servicios de ubicación del dispositivo estén habilitados antes de realizar cualquier acción:

 private boolean doLocationsCheck(){ if(!checkLocationEnabled()){ final CharSequence[] items = {"Yes", "No"}; AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setCancelable(false); builder.setTitle("Location must be enabled to play this game! Would you like to enable it now?"); builder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { final int i = item; runOnUiThread(new Runnable() { public void run() { if(i == 0){ Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); quit(); } else{ quit(); } } }); } }).show(); AlertDialog alert = builder.create(); return false; } else { return true; } } private boolean checkLocationEnabled(){ LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE); boolean enabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER) || service.isProviderEnabled(LocationManager.NETWORK_PROVIDER); return enabled; } 

Después de que me haya asegurado de que los proveedores estén disponibles, configuro una conexión de la siguiente manera:

  private void setupLocation() { LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); LocationListener locationListener = new LocationListener() { public void onLocationChanged(final Location location) { runOnUiThread(new Runnable() { public void run() { mLocation = location; //Log.d(TAG, "Latitude: " + location.getLatitude() + " - Longitude: " + location.getLongitude()); saveLocation(); } }); } public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }; //Can set to GPS or network, whichever is available locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); } 

La ubicación se establece en una variable global cada vez que se actualiza y, a continuación, se guarda en las preferencias. De esta manera, en el caso de que los proveedores estén habilitados, pero estén tomando un tiempo para recuperar la ubicación, el usuario puede seguir utilizando la aplicación con su última ubicación conocida que la aplicación almacenó (no se aplica a la primera vez que el programa Se ejecuta).

Sé que dejé mucho fuera allí, pero pensé que no era realmente necesario, ya que se explica por sí mismo o ya se explicó en una respuesta anterior.

Alegrías

  /* * getting the best location using the location manager * Constants.MINIMUM_TIME_BETWEEN_UPDATES = 1000 Constants.MINIMUM_TIME_BETWEEN_UPDATES = 1 */ LocationManager mLocation; private String mBestProvider; // in your onCreate() do the following mLocation = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); mBestProvider = mLocation.getBestProvider(criteria, false); Location location = mLocation.getLastKnownLocation(mBestProvider); mLocation.requestLocationUpdates( LocationManager.GPS_PROVIDER, Constants.MINIMUM_TIME_BETWEEN_UPDATES, Constants.MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListenerManager() ); // and use the following locationListener inner class private class LocationListenerManager implements LocationListener { public void onLocationChanged(Location location) { String message = String.format( "New Location \n Longitude: %1$s \n Latitude: %2$s", location.getLongitude(), location.getLatitude() ); latitude = location.getLatitude(); longitude = location.getLongitude(); Toast.makeText(MapViewActivity.this, message, Toast.LENGTH_LONG).show(); Log.v("poiint=====", ""+message); } public void onStatusChanged(String s, int i, Bundle b) { Toast.makeText(MapViewActivity.this, "Provider status changed", Toast.LENGTH_LONG).show(); } public void onProviderDisabled(String s) { Toast.makeText(MapViewActivity.this, "Provider disabled by the user. GPS turned off", Toast.LENGTH_LONG).show(); } public void onProviderEnabled(String s) { Toast.makeText(MapViewActivity.this, "Provider enabled by the user. GPS turned on", Toast.LENGTH_LONG).show(); } } 

Usted tiene que inicializar el localizador de localización en el onstartActivity antes de crear para que su ubicación obtenga el valor de ubicación antes onCreate.

  • Cómo forzar mezcla alfa en un videoview
  • ¿Posible superponer un botón encima de otro?
  • Cómo obtener fechas de la base de datos y comprobar si se solapan?
  • No se puede agregar la ventana android.view.ViewRoot$W@44da9bc0 - permiso denegado para este tipo de ventana
  • Comportamiento extraño de superposición al ampliar el MapView
  • Emular el botón Atrás con superposición en Android
  • Android Crear imagen "Ghost" (Touch-through)
  • Dibuja rejilla sobre polígono en Google map V2
  • Animación de superposición de Facebook
  • Superposición de imagen en dos filas en una vista de lista
  • Android - vistas de servicio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.