2013-06-03 6 views
25

Sono un nuovo coder Android e ho problemi con la richiesta di aggiornamenti per la mia localizzazione.Come funziona - requestLocationUpdates() + LocationRequest/Listener

Io lavoro con i tutorial da http://developer.android.com/training/location/receive-location-updates.html.

La mia applicazione può gestire le eccezioni, ottenendo correttamente latitudine e longitute, e geocoder può gestire la visualizzazione dell'indirizzo. Ma chiedo la posizione solo una volta o quando la posizione cambia. Mi piacerebbe fare intervalli di tempo. Per ora ho iniziato a implementare il codice dai tutorial e sembra che:

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

quindi ci sono già implementate e gli intervalli di richiesta di posizione. Ma nel link che ho dato prima c'è un commento che dovrei usare da qualche parte requestLocationUpdates() (probabilmente onCreate(), onStart() e rimozione di richiesta su onStop()), ma ho un problema con esso. Quindi, Eclipse mi mostra 3 metodi:

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

Quindi il primo che penso sia più corretto in questo posto. Cosa devo inserire nello slot LocationListener? Chiedo aiuto con poche spiegazioni su come funziona.

risposta

30

si sta implementando LocationListener nella tua attività MainActivity. La richiesta di aggiornamenti di posizione simultanei sarà Perciò sarà come questo:

mLocationClient.requestLocationUpdates(mLocationRequest, this); 

Per essere sicuri che si sta LocationListener attuazione è dal API di Google, ovvero importare questo:

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

e non questo:

import android.location.LocationListener; 

e dovrebbe funzionare bene.

È anche importante che LocationClient sia realmente collegato prima di eseguire questa operazione. Ti suggerisco di non chiamarlo nei metodi onCreate o onStart, ma in onResume. Tutto è spiegato abbastanza bene nel tutorial di Google Location Api: https://developer.android.com/training/location/index.html

+1

Esattamente quello che ho incasinato.Grazie. :) –

+0

Quindi so che requestLocationUpdates restituirà la posizione su PendingIntent ma dove posso accedere alla posizione restituita? – geckob

+2

Per chiamare questa richiesta è necessario un corso per implementare LocationUpdates. Questa implementazione ha il metodo OnLocationChanged (Posizione posizione). Qui è dove si accede alla posizione restituita. La classe pubblica MyLocationListener implementa LocationListener {...} – Totalys

7

Io uso questo:

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

Ad esempio, utilizzando un intervallo 1s:

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

il tempo è in millisecondi, la distanza è in metri.

Questo chiama automaticamente:

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

ho anche avuto questi incluso nello script sbagliando di poco in realtà li usano:

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

In breve:

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

La distanza è ** sempre ** metri. – hd1

+0

Non viene eseguito automaticamente. OnLocationChanged viene chiamato quando cambia la posizione. E che in alcuni casi richiede tempo –