2012-04-22 21 views
6

Se supone que mi código busca la ubicación de los usuarios y coloca un marcador en el mapa al ingresar a la aplicación. Mi valor de ubicación siempre es igual a nulo, y nunca recibe un valor.Google maps api no coloca marcador en la ubicación correcta

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

      } 

     } 
+0

¿Quizás su búsqueda de Google no está lista en el momento en que ingresa la declaración if? Yo uso google maps javascript api y hay una función de devolución de llamada que se llama cuando se completa la búsqueda. No sé cómo funciona en Android. –

+0

Consulte este [LINK] (http://stackoverflow.com/questions/9990209/cant-mark-while-showing-the-current-location-in-mapview/9990668#9990668) tiene una explicación clara y clara de su requisito y cómo colocar marcadores. –

+0

Puedo colocar marcadores muy bien, mi problema es que no tiene una buena ubicación al inicio. También coloqué este código en mi método de creación, simplemente sigue esperando directamente a mi declaración de otro. ¿Tiene que ver con mis permisos? –

Respuesta

1

he tenido un problema relativamente similar con un juego de rol GPS que estaba trabajando y aquí están algunas cosas que noté:

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

También es posible que desee asegurarse los servicios de ubicación del dispositivo en realidad están habilitadas antes de hacer nada:

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 me he asegurado de los proveedores son de configuración disponibles que una conexión de este modo:

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 luego se guarda en las preferencias. De esta forma, en el caso de que los proveedores estén habilitados, pero demoren un tiempo en 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 omití mucho, pero pensé que no era realmente necesario ya que se explica por sí mismo o ya se explicó en una respuesta anterior.

Saludos ~

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

} 
0

Usted tiene que inicializar el LocationListener en el onstartActivity antes de crear de modo que la ubicación obtener el valor de la ubicación antes onCreate.

Cuestiones relacionadas