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) {}
};
}
Czy jesteś sympatyczny w swoim telefonie? –
Po prostu ustaw dowolne miejsce w momencie, gdy dopiero zaczynasz aplikację, a następnie pobierz getLastKnownLocation ... –
Dzięki chłopaki. Tak, mam tylko sim w telefonie - emulator w Eclipse nie zawsze działa poprawnie dla mnie. – crispy