2012-04-22 12 views
6

Mein Code soll den Standort des Benutzers ermitteln und bei der Eingabe der Anwendung einen Marker auf der Karte platzieren. Mein Standortwert ist immer gleich null und erhält niemals einen Wert.Google Maps api platziert keine Markierung an einem geeigneten Ort

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

Vielleicht ist Ihre Google-Suche nicht fertig zu dem Zeitpunkt, wenn Sie die if-Anweisung eingeben? Ich benutze Google Maps Javascript API und es gibt eine Callback-Funktion, die aufgerufen wird, wenn die Suche abgeschlossen ist. Ich weiß nicht, wie es bei Android funktioniert. –

+0

Siehe [LINK] (http://stackoverflow.com/questions/9990209/cant-mark-while-showing-the-current-location-in-mapview/9990668#9990668) es hat eine klare und klare Erklärung Ihrer Anforderung und wie Marker platziert werden. –

+0

Ich kann Marker gut platzieren, mein Problem ist, dass es keine gute Position beim Start gibt. Ich habe diesen Code auch in meine on create-Methode eingefügt, er hofft einfach direkt auf meine else-Anweisung. Hat es mit meinen Berechtigungen zu tun? –

Antwort

1

ich ein relativ ähnliches Problem mit einer GPS-RPG hatte ich arbeite und hier sind einige Dinge, die ich bemerkte:

Erstens ist es eine Weile für Ihren Standort nehmen zunächst gefunden werden, was dazu führen würde, dieses Problem, da Sie nur überprüfen, ob der Standort null ist.

Sie auch sicher, dass tatsächlich vor etwas zu tun aktiviert sind die Ortungsdienste des Geräts machen wollen kann:

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; 
} 

Nachdem ich sicher gemacht haben die Anbieter zur Verfügung ich Setup sind eine Verbindung wie folgt:

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

Der Speicherort wird dann bei jeder Aktualisierung in einer globalen Variablen gespeichert und dann in den Voreinstellungen gespeichert. Auf diese Weise kann der Benutzer die Anwendung mit dem letzten bekannten Standort, den die App gespeichert hat, weiterhin verwenden, wenn die Anbieter zwar aktiviert sind, aber einige Zeit benötigen, um den Standort abzurufen (gilt nicht für das erste Mal, wenn das Programm ausgeführt wird) es läuft).

Ich weiß, ich habe dort viel weggelassen, aber ich dachte, dass es nicht wirklich notwendig war, da es entweder selbsterklärend war oder bereits in einer vorherigen Antwort erklärt wurde.

Cheers ~

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

Sie haben die Location im onstartActivity zu initialisieren, bevor Sie erstellen, so dass es Standort den Standort Wert vor onCreate erhalten.

Verwandte Themen