0

GoogleマップのLocationListenerをGoogleマップで使用しています。私のアプリケーションでは、これはユーザーが移動したルートの線を描きます。私は、ユーザーが既に行っていたポジションにいるときに警告を出したい。しかし、私のためにこれを行うサービスが存在するのかどうか、私はすべてを実装しているのかどうかはわかりません。私はジオローカライゼーションの概念を理解していません。デバイスが既にGoogleMapsでポジションを通過しているかどうかを確認するにはどうすればよいですか?

したがって、トレースされたルートを通過しているときに、ユーザーに警告が欲しいです。

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

答えて

0

サービスはGeofence Monitoringであり(例えばthis one)を用いた実施例およびチュートリアルの多くがあること。

+0

このサービスは、100の領域のみをサポートしています。このサービスは私のアプリケーションでは機能しません。そして、そのエリアは円形で、私は直線的な制限が必要です。 – Augusto

+1

@Augusto 1)100 **アクティブ** "エリア" **デバイスごとに**; 2)なぜそれは動作しませんでしたか? 3)とにかく、ターゲットエリアの周りに円を描くことができます。そして、この円形ジオフェンスの警告がスローされたら、ターゲットエリア内にあるかどうかを評価します。しかし、それは可能な解決策の1つではありません。お客様が説明したように、常にカスタムサービスを作成できます。 –

+0

私の問題は、運転手に既に道路を渡っていることを警告することで、サークルは私の問題を解決できないということです。ポリラインをトレースして、PolyUtilメソッドでチェックし、問題のポイントが以前のポイントで作成されたポリラインの内側にあるかどうかを確認します。もちろん、メートルのいくつかの許容誤差で。私が最も実現可能であり、実現することができたのはこの方法でした。私はこの分野で初めてであり、実装できなかったソリューションです。 – Augusto

関連する問題