2013-06-03 10 views
25

Jestem nowym koderem Androida i mam problem z żądaniem aktualizacji mojej lokalizacji.Jak to działa - requestLocationUpdates() + LocationRequest/Listener

Pracuję z samouczkami od http://developer.android.com/training/location/receive-location-updates.html.

Moja aplikacja może obsługiwać wyjątki, uzyskiwać odpowiednio szerokość i długość geograficzną, a geocoder może obsłużyć wyświetlanie adresu. Ale pytam o lokalizację tylko raz - lub kiedy zmiany lokalizacji. Chciałbym robić odstępy czasowe. Teraz zacząłem wdrażaniu kod z tutoriali i wygląda na to, że:

public class MainActivity extends Activity implements 
GooglePlayServicesClient.ConnectionCallbacks, 
GooglePlayServicesClient.OnConnectionFailedListener, 
LocationListener { 

private static final int MILLISECONDS_PER_SECOND = 1000; 

public static final int UPDATE_INTERVAL_IN_SECONDS = 5; 
private static final long UPDATE_INTERVAL = 
      MILLISECONDS_PER_SECOND * UPDATE_INTERVAL_IN_SECONDS; 

private static final int FASTEST_INTERVAL_IN_SECONDS = 1; 
private static final long FASTEST_INTERVAL = 
      MILLISECONDS_PER_SECOND * FASTEST_INTERVAL_IN_SECONDS; 

private TextView tvStatus; 
private TextView tvLatitude; 
private TextView tvLongitude; 

LocationRequest mLocationRequest; 
LocationClient mLocationClient; 
Location mCurrentLocation; 

boolean bNetworkEnabled; 
boolean bGPSEnabled; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    tvStatus = (TextView)findViewById(R.id.tvStatus); 
    tvLatitude = (TextView)findViewById(R.id.tvLatitude); 
    tvLongitude = (TextView)findViewById(R.id.tvLongitude); 

    mLocationRequest = LocationRequest.create(); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    mLocationRequest.setInterval(UPDATE_INTERVAL); 
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL); 
    mLocationClient = new LocationClient(this, this, this); 

    checkProviders(); 
} 

Więc nie są już wdrażane i interwały prośba lokalizacja. Ale w linku podałem przed komentarzem, który powinienem użyć gdzieś requestLocationUpdates() (prawdopodobnie onCreate(), onStart() i usunięcie żądania na onStop()), ale mam z tym problem. Tak więc, Eclipse pokazuje mi 3 metody:

requestLocationUpdates(LocationRequest request, LocationListener listener) 
requestLocationUpdates(LocationRequest request, PendingIntent CallbackIntent) 
requestLocationUpdates(LocationRequest request, LocationListener listener, Looper looper) 

Tak więc pierwsza myślę, że jest najbardziej odpowiednia w tym miejscu. Co powinienem umieścić w gnieździe LocationListener? Proszę o pomoc z niewielkim wyjaśnieniem, jak to działa.

Odpowiedz

30

implementujesz LocationListener w twojej działalności MainActivity. Wezwanie do jednoczesnych zmianach lokalizacji będzie dla nich być tak:

mLocationClient.requestLocationUpdates(mLocationRequest, this); 

Pamiętaj, że LocationListener jesteś wykonawczych jest z Google API, czyli importować ten:

import com.google.android.gms.location.LocationListener; 

i nie w ten sposób:

import android.location.LocationListener; 

i powinno działać dobrze.

Ważne jest również, aby usługa LocationClient była rzeczywiście podłączona przed wykonaniem tej czynności. Sugeruję, aby nie wywoływać go w metodach onCreate lub onStart, ale w onResume. Wszystko to jest dobrze wyjaśnione w tutorialu dotyczącym lokalizacji Google Api: https://developer.android.com/training/location/index.html

+1

Dokładnie to, co zepsułem.Dziękuję Ci. :) –

+0

Więc wiem, że 'requestLocationUpdates' zwróci Location to PendingIntent, ale gdzie mogę uzyskać dostęp do zwróconej lokalizacji? – geckob

+2

Aby wywołać to żądanie, musisz zaimplementować klasę LocationUpdates. Ta implementacja ma metodę OnLocationChanged (lokalizacja lokalizacji). Tutaj uzyskujesz dostęp do zwróconej lokalizacji. klasa publiczna MyLocationListener implementuje LocationListener {...} – Totalys

7

użyć tego:

LocationManager.requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener) 

Na przykład, przy użyciu 1s oleju:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,0,this); 

czas w milisekundach odległość jest w metrach.

To automatycznie wywołuje:

public void onLocationChanged(Location location) { 
    //Code here, location.getAccuracy(), location.getLongitude() etc... 
} 

Miałem również te zawarte w skrypcie, ale nie zrobił rzeczywiście z nich korzystać:

public void onStatusChanged(String provider, int status, Bundle extras) {} 
public void onProviderEnabled(String provider) {} 
public void onProviderDisabled(String provider) {} 

W skrócie:

public class GPSClass implements LocationListener { 

    public void onLocationChanged(Location location) { 
     // Called when a new location is found by the network location provider. 
     Log.i("Message: ","Location changed, " + location.getAccuracy() + " , " + location.getLatitude()+ "," + location.getLongitude()); 
    } 

    public void onStatusChanged(String provider, int status, Bundle extras) {} 
    public void onProviderEnabled(String provider) {} 
    public void onProviderDisabled(String provider) {} 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,0,this); 
    } 
} 
+3

Odległość wynosi ** zawsze ** metrów. – hd1

+0

Nie uruchamia się automatycznie. Funkcja onLocationChanged jest wywoływana po zmianie lokalizacji. A to w niektórych przypadkach wymaga czasu. –