2012-04-22 14 views
6

Mój kod ma na celu sprawdzenie lokalizacji użytkownika i umieszczenie znacznika na mapie po wejściu do aplikacji. Moja wartość lokalizacji zawsze jest równa zeru i nigdy nie otrzymuje wartości.Google map nie umieszcza znacznika w dobrej lokalizacji

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

Być może wyszukiwanie google nie jest gotowe w momencie wpisywania instrukcji if? Używam google maps javascript api i istnieje funkcja wywołania zwrotnego, która jest wywoływana po zakończeniu wyszukiwania. Nie wiem, jak to działa na Androidzie. –

+0

Skorzystaj z [LINK] (http://stackoverflow.com/questions/9990209/cant-mark-while-showing-turrent-location-in-mapview/9990668#9990668), które zawiera czyste i jasne wyjaśnienie wymóg i sposób umieszczania znaczników. –

+0

Umieszczę markery w porządku, moim problemem jest to, że nie ma dobrej lokalizacji na początku. Umieściłem ten kod również w mojej metodzie tworzenia, ale mam nadzieję, że prosto do mojego zdania else. ma to związek z moimi uprawnieniami? –

Odpowiedz

1

miałem stosunkowo podobny problem z RPG GPS byłem w pracy i oto kilka rzeczy, zauważyłem:

Po pierwsze, może to potrwać do lokalizacji początkowo można znaleźć, co spowodowałoby ten problem, ponieważ sprawdzasz tylko, czy lokalizacja jest pusta.

Warto również upewnić się, usług lokalizacyjnych urządzenia są faktycznie włączone zanim cokolwiek:

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

Po Zrobiłem pewien dostawcy są dostępne konfiguracja I połączenie tak:

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

Lokalizacja jest następnie ustawiana w zmiennej globalnej, gdy jest aktualizowana, a następnie zapisywana w preferencjach. W ten sposób, w przypadku gdy dostawcy są aktywowani, ale trochę czasu zajmuje im odzyskanie lokalizacji, użytkownik może nadal korzystać z aplikacji z ich ostatnią znaną lokalizacją, która była przechowywana w aplikacji (nie ma zastosowania po raz pierwszy w programie prowadzony jest).

Wiem, że wiele tam pominąłem, ale doszedłem do wniosku, że nie było to konieczne, ponieważ było to albo oczywiste, albo już wyjaśnione w poprzedniej odpowiedzi.

Pozdrawiam ~

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

Trzeba przed zainicjować locationlistener w onstartActivity na stworzenie tak, że położenie uzyskać wartość lokalizacji przed onCreate.