2012-12-11 9 views
5

OK, spędziłem mnóstwo czasu na poszukiwaniu i czytaniu, a nie tylko na tej stronie. Większość wątków zajmuje się GPS lub próbuje uruchomić go w emulatorze. Dokumentacja na developer.android.com wyjaśnia tylko do pewnego momentu. Nie mogę dostać prostej rzeczy do pracy. Podobnie jak większość osób z tym problemem, chcę tylko uzyskać ostatnią znaną lokalizację od operatora sieci i nie dostanie go, nawet zaraz po korzystaniu z map Google (przy użyciu dostawcy sieci, ponieważ GPS był wyłączony) i pokazał mi tylko 1/8 do 1/4 mili. Ok, więc "dostawca" (wieże komórkowe/wi-fi, jeśli jest włączone) otrzymuje poprawkę do map Google. Próbuję mojej aplikacji i nie mogę uzyskać ostatniej znanej lokalizacji. Nie próbuję nawet pokazać tego w Mapach, ponieważ po naciśnięciu przycisku wypisuję długie i długie współrzędne na ekranie, aby uzyskać lokalizację. Dokumentacja nie mówi nic o ostatniej lokalizacji, która musi być wykonana z tej samej działalności. Mówi, że zwróci ostatnią znaną lokalizację od określonego dostawcy. Określam NETWORK_PROVIDER, które dokumentacja mówi wieże komórek i Wi-Fi. (I tak, mam to w manifeście.)getLastKnownLocation z NETWORK_PROVIDER na zwroty telefoniczne null

Czy ktoś wie, jak to działa? Jeszcze nie widzę dobrego wyjaśnienia, nawet na stronie Google. Jeśli nie możesz powiedzieć, jestem sfrustrowany. To oczywiście coś, co robię (lub nie), więc nie obwiniam niczego/nikogo oprócz mnie, z wyjątkiem dokumentacji, która jest nieco zbyt krótka dla moich potrzeb.

AKTUALIZACJA: Używam teraz detektora lokalizacji i lokalizacji, zakładam ostatnią lokalizację. Wydaje się logiczne, że można uzyskać ostatnią lokalizację bez uruchamiania aktualizacji lokalizacji za pośrednictwem odbiornika lokalizacji, ale ja nie, a teraz korzystam z detektora lokalizacji.

Teraz mój problem polega na tym, że nie mogę zmienić lokalizacji. Mój kod nie robi nic teraz, poza tym, że próbuje uzyskać aktualizacje lokalizacji przez słuchacza, a także akceptuje naciśnięcie przycisku, aby przechwycić ostatnią znaną lokalizację. Mapy Google pokażą mi, gdzie jestem, ale nadal otrzymuję lokalizację w promieniu 20 mil od mojego kodu. Mam wrażenie, że jest szansa, że ​​faktycznie otrzymuję nową lokalizację, ale mogę mieć wadliwe użycie ostatecznych/statycznych deklaracji, które powstrzymują mnie przed przechowywaniem i używaniem tej lokalizacji, kiedy jej potrzebuję. Mój manifest ma prawa dostępu do Internetu i uprawnień do wykonywania dokładnych ustawień, a plik xml dla działania działa poprawnie - udostępnia tylko przycisk do włączania/wyłączania wyszukiwania na żywo, przycisk do ręcznego pobierania ostatniej lokalizacji i widok tekstowy do wyświetlania szerokości i długości geograficznej. Próbowałem rozebrać nieistotne, aby nie było zbyt długo.

public class RMain extends Activity { 

public boolean islivesearchon; 
public static double netlistentime = 0 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds 
public static double netlistendistance = 0 * 1609.344; // miles * conversion to meters 
public static double gpslistentime = 30 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds 
public static double gpslistendistance = 0 * 1609.344; // miles * conversion to meters 

private static Location currentlocation; 
private LocationManager locationManager; 
private LocationListener locationListener; 
public static Criteria criteria; 
public TextView latview; 
public TextView longview; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_rmain); 

    latview = (TextView) findViewById(R.id.display_latitude); 
    longview = (TextView) findViewById(R.id.display_longitude); 

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

    // setup bestProvider 
    criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); 
    String bestprovider = locationManager.getBestProvider(criteria, true); 

    // get an initial current location 
    currentlocation = locationManager.getLastKnownLocation(bestprovider); 
    latview.setText(Double.toString(currentlocation.getLatitude())); 
    longview.setText(Double.toString(currentlocation.getLongitude())); 

    // Define locationListener interface 
    locationListener = new LocListener(); 

    // React to LiveSearch toggle button press 
    final Button livesearch = (Button) findViewById(R.id.button_livesearch); 
    livesearch.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      TextView livesearchview = (TextView) findViewById(R.id.button_livesearch); 
      boolean isNetEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
      boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

      if(islivesearchon) { 
       locationManager.removeUpdates(locationListener); 
       islivesearchon = false; 
       livesearchview.setText("Live Search is OFF"); 
      } 
      else { 
       // ideally should check for !isProviderEnabled first, then provide option for turning it on 
       if(isNetEnabled) { 
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, (long) netlistentime, (float) netlistendistance, locationListener); 
        islivesearchon = true; 
        livesearchview.setText("Live Search is ON"); 
       } 
       // ideally should check for !isProviderEnabled first, then provide option for turning it on 
       if(isGpsEnabled) { 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, (long) gpslistentime, (float) gpslistendistance, locationListener); 
        islivesearchon = true; 
        livesearchview.setText("Live Search is ON"); 
       } 
      } 
     } 
    }); 

    // Respond to Get Location button click to get last known location 
    final Button getlocation = (Button) findViewById(R.id.button_getlocation); 
    getlocation.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      String bestprovider = locationManager.getBestProvider(criteria, true); 
      Location lastlocation = locationManager.getLastKnownLocation(bestprovider); 

      latview.setText(Double.toString(lastlocation.getLatitude())); 
      longview.setText(Double.toString(lastlocation.getLongitude())); 
     } 
    }); 

} 

private class LocListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location latestlocation) { 
     // Called when a new location is found by the network location provider. 
     currentlocation.set(latestlocation); 
     latview.setText(Double.toString(currentlocation.getLatitude())); 
     longview.setText(Double.toString(currentlocation.getLongitude())); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 

    @Override 
    public void onProviderEnabled(String provider) {} 

    @Override 
    public void onProviderDisabled(String provider) {} 
}; 

}

+1

Czy jesteś sympatyczny w swoim telefonie? –

+1

Po prostu ustaw dowolne miejsce w momencie, gdy dopiero zaczynasz aplikację, a następnie pobierz getLastKnownLocation ... –

+0

Dzięki chłopaki. Tak, mam tylko sim w telefonie - emulator w Eclipse nie zawsze działa poprawnie dla mnie. – crispy

Odpowiedz

7

Spróbuj sprawdzić za pomocą tego ... po wywołaniu onLocationChange, po tym stare wartości można uzyskać za pomocą ostatniej znanej lokalizacji.

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

     location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     if (location != null) { 

      old_latitude=location.getLatitude(); 
      old_longitude=location.getLongitude(); 
      Log.d("old","lat : "+old_latitude); 
      Log.d("old","long : "+old_longitude); 

      this.onLocationChanged(location); 
     } 
+0

Nie umieściłem jeszcze metody onlocationchange. Wygląda na to, że powinienem być w stanie uzyskać ostatnią znaną lokalizację z NETWORK_PROVIDER, jak opisano w dokumentacji, ale nie mogę nawet tego zdobyć. Teraz zamierzam po prostu wyjść i napisać cały kod, aby uzyskać lokalizację na podstawie ostatniego, najlepszego, najnowszego itd. ... i zobaczyć, jak to działa. Uczę się JAVA i po prostu frustruje próbując zrobić to, co dokumentacja sprawia, że ​​brzmi tak, jak powinno. Myślę, że jeśli nie mogę nawet wykonać tego prostego polecenia, zapomnij o wszystkich innych elementach lokalizacji ... – crispy

+0

po prostu użyj onlocationchanged() raz, po czym otrzymasz ostatnią znanąklubęlacji() za każdym razem :). aż do zmiany lokalizacji ponownie. to zadziała na pewno :) – Rahul

4

Zwraca „null”, gdy usługa zostanie wyłączona w Ustawienia> Lokalizacja i zabezpieczenia> lokalizacji poprzez sieć

Tak, że może zdarzyć się dość często.

+0

Dzięki. Mój telefon ma "usługi lokalizacyjne Google", które są zaznaczone, "Usługa samodzielnego GPS", która obecnie nie jest wybrana, oraz "Usługi lokalizacyjne VZW" (usługi lokalizacyjne świadczone przez Verizon), które są sprawdzane. Ponownie, Google otrzyma poprawkę zi bez wi-fi (lepiej z wi-fi) i bez GPS. Natychmiast wchodzę do mojej aplikacji i nie mogę uzyskać ostatniej lokalizacji - zawsze 0,0 i 0,0. Zaczynam myśleć, że dostarcza ona ostatnią lokalizację, którą moja aplikacja pobrała od określonego dostawcy.Znalazłem inny wątek, w którym ktoś wspomniał o tym, że może się to wydarzyć z powodów bezpieczeństwa. – crispy

+0

Proszę, proszę mój ans. i zamknij pytanie –

+0

Dobra odpowiedź .. Przetestowałem to na Micromax i Samsung. Idealny. – Siddharth

Powiązane problemy