2013-01-17 18 views
8

A LocationSource è definito in Google Maps Android API v2.API Android di Google Maps v2 creando una nuova LocationSource

Viene utilizzato per googlemap come provider di posizione. Per impostazione predefinita, l'origine della posizione viene fornita dal modulo GPS sul telefono.

Ma ora voglio utilizzare un altro Location source, i dati sulla posizione verranno inviati periodicamente al dispositivo Android.

Non ho idea di come implementare questa interfaccia. C'è qualche esempio là fuori? Qualcuno può aiutarmi con questo? Il documento non ha detto nulla al riguardo.

risposta

4

C'è qualche esempio là fuori?

Non c'è molto per l'interfaccia, e la sua implementazione dipende molto dalla tua app.

This sample project implementa l'interfaccia LocationSource sull'attività principale:

@Override 
    public void activate(OnLocationChangedListener listener) { 
    this.mapLocationListener=listener; 
    } 

    @Override 
    public void deactivate() { 
    this.mapLocationListener=null; 
    } 

Tutto ciò che faccio è tenere sul OnLocationChangedListener che ci vengono consegnati in activate(). Quindi, quando si ha una correzione di posizione che si desidera alimentare alla mappa, chiamare onLocationChanged() su quel listener, fornendo un oggetto Location (lo stesso oggetto Location che si potrebbe ottenere da LocationManager).

12

Ecco una semplice implementazione dell'interfaccia LocationSource. Nel mio caso sto registrando sia il GPS che i fornitori di servizi di rete. Come menzionato da @CommonsWare, l'implementazione potrebbe dipendere molto dalle tue esigenze. Vorrei suggerire la lettura di official documentation sul servizio di localizzazione Per capire meglio come utilizzare le vostre esigenze e risparmiare energia della batteria

public class CurrentLocationProvider implements LocationSource, LocationListener 
{ 
    private OnLocationChangedListener listener; 
    private LocationManager locationManager; 

    public CurrentLocationProvider(Context context) 
    { 
     locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
    } 

    @Override 
    public void activate(OnLocationChangedListener listener) 
    { 
     this.listener = listener; 
     LocationProvider gpsProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER); 
     if(gpsProvider != null) 
     { 
      locationManager.requestLocationUpdates(gpsProvider.getName(), 0, 10, this); 
     } 

     LocationProvider networkProvider = locationManager.getProvider(LocationManager.NETWORK_PROVIDER);; 
     if(networkProvider != null) { 
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000 * 60 * 5, 0, this); 
     } 
    } 

    @Override 
    public void deactivate() 
    { 
     locationManager.removeUpdates(this); 
    } 

    @Override 
    public void onLocationChanged(Location location) 
    { 
     if(listener != null) 
     { 
      listener.onLocationChanged(location); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) 
    { 
     // TODO Auto-generated method stub 

    } 
} 

Ed ecco come avrei usato questa classe:

protected void setUpMap() { 
    //init routine 
    ....... 

    this.map.setLocationSource(new CurrentLocationProvider(this)); 
    .......  
} 

EDIT Per favore non che questa soluzione sia obsoleta! È necessario utilizzare FusedLocationProviderApi in combinazione con GoogleApiClient per il tracciamento posizione corrente

Problemi correlati