0

Ich verwende eine LocationListener der GoogleMaps API, um mit Karten zu arbeiten. In meiner Anwendung zeichnet dies eine Linie der Route, die der Benutzer zurückgelegt hat. Ich möchte eine Warnung einrichten, wenn sich der Benutzer in einer Position befindet, in der er bereits war. Aber ich weiß nicht, ob es einen Service gibt, der das für mich tut, oder habe ich alle ein Werkzeug. Ich verstehe das Konzept der Geolokalisierung nicht.Wie kann überprüft werden, ob das Gerät bereits eine Position mit GoogleMaps übergeben hat?

Also möchte ich den Benutzer warnt, wenn es über die Route verfolgt.

private class FollowMeLocationSource implements LocationSource, LocationListener { 

    private OnLocationChangedListener onLocationChangedListener; 
    private LocationManager locationManager; 
    private LocationListener locationListener; 

    private final Criteria criteria = new Criteria(); 
    private String bestAvailableProvider; 

    /* Updates are restricted to one every 10 seconds, and only when 
    * movement of more than 10 meters has been detected.*/ 
    private final long minTime = 2000; 
    private final float minDistance = 5; 

    private FollowMeLocationSource() { 

     locationManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE); 
     getBestAvailableProvider(); 
     // Specify Location Provider criteria 
     criteria.setAccuracy(Criteria.ACCURACY_FINE); 
     criteria.setPowerRequirement(Criteria.POWER_LOW); 
     criteria.setAltitudeRequired(true); 
     criteria.setBearingRequired(true); 
     criteria.setSpeedRequired(true); 
     criteria.setCostAllowed(true); 

     locationManager.requestLocationUpdates(bestAvailableProvider,minTime,minDistance,this); 
    } 

    private void getBestAvailableProvider() { 
     /* The preffered way of specifying the location provider (e.g. GPS, NETWORK) to use 
     * is to ask the Location Manager for the one that best satisfies our criteria. 
     * By passing the 'true' boolean we ask for the best available (enabled) provider. */ 
     bestAvailableProvider = locationManager.getBestProvider(criteria, true); 
     Log.i(TAG,"bestAvailableProvider: " + bestAvailableProvider); 
    } 

    /* Activates this provider. This provider will notify the supplied listener 
    * periodically, until you call deactivate(). 
    * This method is automatically invoked by enabling my-location layer. */ 
    @Override 
    public void activate(OnLocationChangedListener listener) { 
     Log.i(TAG,"activate"); 
     // We need to keep a reference to my-location layer's listener so we can push forward 
     // location updates to it when we receive them from Location Manager. 
     onLocationChangedListener = listener; 

     // Request location updates from Location Manager 
     if (bestAvailableProvider != null) { 
      //locationManager.requestLocationUpdates(bestAvailableProvider, minTime, minDistance, this); 
      Log.i(TAG,"activate, bestProvider != null"); 
      locationManager.requestLocationUpdates(bestAvailableProvider,minTime,minDistance,this); 
     } else { 
      Log.i(TAG,"activate, bestProvider == null"); 
      // (Display a message/dialog) No Location Providers currently available. 
     } 
    } 

    /* Deactivates this provider. 
    * This method is automatically invoked by disabling my-location layer. */ 
    @Override 
    public void deactivate() { 
     Log.i(TAG,"deactivate"); 
     // Remove location updates from Location Manager 
     locationManager.removeUpdates(this); 

     onLocationChangedListener = null; 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     Log.i(TAG,"onLocationChanged. Latitude: " + location.getLatitude() + " - Longitude: " + location.getLongitude()); 
     /* Push location updates to the registered listener.. 
     * (this ensures that my-location layer will set the blue dot at the new/received location) */ 
     if (onLocationChangedListener != null) { 
      onLocationChangedListener.onLocationChanged(location); 
     } 

     /* ..and Animate camera to center on that location ! 
     * (the reason for we created this custom Location Source !) */ 
     listaRota.add(location); 

     if (listaRota.size() == 1) { 
      mMap.addMarker(new MarkerOptions().position(new LatLng(location.getLatitude(),location.getLongitude())).title("Inicio")); 
     } 

     if (listaRota.size() >= 2) { 
      drawPolyLineOnMap(); 
     } 

     mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()),15)); 
    } 

    @Override 
    public void onStatusChanged(String s, int i, Bundle bundle) { 
     Log.i(TAG,"onStatusChanged: " + s + ", Estado: " + i); 
    } 

    @Override 
    public void onProviderEnabled(String s) { 
     Log.i(TAG,"onProviderEnabled: " + s); 
    } 

    @Override 
    public void onProviderDisabled(String s) { 
     Log.i(TAG,"onProviderDisabled: " + s); 
    } 
} 

public void drawPolyLineOnMap() { 

    List<LatLng> list = new ArrayList<>(); 

    for(Location l : listaRota) { 
     list.add(new LatLng(l.getLatitude(),l.getLongitude())); 
    } 

    PolylineOptions polylineOptions = new PolylineOptions(); 
    polylineOptions.color(Color.BLUE); 
    polylineOptions.width(15); 
    polylineOptions.addAll(list); 

    mMap.clear(); 
    mMap.addPolyline(polylineOptions); 
} 

Antwort

0

Dieser Dienst ist Geofence Monitoring und es gibt viele Beispiele und Tutorials für die Verwendung es (z this one).

+0

Dieser Dienst unterstützt nur 100 Bereiche. Dieser Dienst funktioniert nicht für meine Anwendung. Und die Bereiche sind kreisförmig und ich brauche gerade Grenzen. – Augusto

+1

@Augusto 1) 100 ** aktive ** "Bereiche" ** pro Gerät **; 2) warum es nicht funktioniert hat? 3) Wie auch immer, Sie können einen Kreis um den Zielbereich herum erstellen. Wenn eine Warnung für diesen kreisförmigen Geofence ausgelöst wird, prüfen Sie, ob er sich auch in Ihrem Zielbereich befindet. Aber es ist nicht die eine mögliche Lösung: Sie können immer benutzerdefinierten Service erstellen, wie Sie beschrieben haben. –

+0

Mein Problem ist es, einen Fahrer zu warnen, dass er bereits ein Stück Straße passiert hat, also lösen Kreise mein Problem nicht. Ich zeichne also eine Polylinie ab und überprüfe mit einer PolyUtil-Methode, ob der betreffende Punkt innerhalb der Polylinie liegt, die mit den vorherigen Punkten erstellt wurde. Natürlich mit einiger Toleranz von Metern. Es war diese Methode, die ich am besten fand und die ich umsetzen konnte. Ich bin neu in diesem Bereich und Ihre Lösung konnte ich nicht implementieren. – Augusto

Verwandte Themen