2017-01-31 8 views
0

как нажать долготы и широты на сервер для каждых определенных расстояний покрыто требования здесь, чтобы решить, чтобы передавать данные на сервер Согласно наблюдениям 100ого каждому разкак нажать долготы и широты на сервер для каждых определенных расстояний покрыто

общественности класс LocationUpdateIntentService расширяет IntentService реализует LocationListener {

private static final Location TODO = null; 
private Activity activity; 
//Location Manager 
LocationManager locationManager; 
public static Boolean isRunning = false; 
Location location; 
Map<String, String> inputMap; 
float minimumDistanceBetweenUpdates = 10; 
double initialLat; 
double initialLong; 
double finalLat; 
double finalLong; 
LocationRequest locationRequest; 

public LocationUpdateIntentService() { 
    super("locationUpdateService"); 
} 

public LocationUpdateIntentService(Activity activity) { 
    super("locationUpdateService"); 
    this.activity = activity; 
} 

public LocationUpdateIntentService(Activity baseActivity, Map<String, String> inputMap) { 
    super("locationUpdateService"); 
    this.activity = baseActivity; 
    this.inputMap = inputMap; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); 
    /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 
     if (Permissions.getLocationPermissionStatus(activity)){ 
      location = getLastKnownLocation(); 
     } 
    } else { 
     location = getLastKnownLocation(); 
    }*/ 
    location = getLastKnownLocation(); 

    LocationRequest request = new LocationRequest(); 
    request.setSmallestDisplacement(minimumDistanceBetweenUpdates); 
} 

Handler mHandler = new Handler(); 
Runnable mHandlerTask = new Runnable() { 
    @Override 
    public void run() { 
     if (!isRunning) { 
      startListening(); 
     } 
     mHandler.postDelayed(mHandlerTask, C.TIME_LOCATION_UPDATE); 
    } 
}; 

@Override 
protected void onHandleIntent(Intent intent) { 
    mHandlerTask.run(); 
} 

public void startListening() { 
    if (location != null) { 
     location = getLastKnownLocation(); 

     initialLong = location.getLongitude(); 
     initialLat = location.getLatitude(); 
     /* String latitudeintial = String.valueOf(location.getLatitude()); 
     String longitudeintial = String.valueOf(location.getLongitude()); 

     // server Call : Location Update Server Call 
     LocationUpdateServerCall locationUpdateServerCall = new LocationUpdateServerCall(getApplicationContext()); 
     locationUpdateServerCall.pushLocationUpdateServerCall(latitudeintial, longitudeintial);*/ 

    } 
} 

public Location getLastKnownLocation() { 
    Location location = null; 
    locationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE); 
    List<String> providers = locationManager.getProviders(true); 

    for (String provider : providers) { 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return TODO; 
     } 
     Location l = locationManager.getLastKnownLocation(provider); 

     if (l == null) { 
      continue; 
     } 
     if (location == null 
       || l.getAccuracy() < location.getAccuracy()) { 
      location = l; 
     } 
    } 
    if (location == null) { 
     return null; 
    } 
    return location; 
} 


@Override 
public void onLocationChanged(Location location) { 
    this.location = location; 
    if (location != null) { 
     /* String latitude = String.valueOf(location.getLatitude()); 
     String longitude = String.valueOf(location.getLongitude()); 

     // server Call : Location Update Server Call 
     LocationUpdateServerCall locationUpdateServerCall = new LocationUpdateServerCall(getApplicationContext()); 
     locationUpdateServerCall.pushLocationUpdateServerCall(latitude, longitude);*/ 

     finalLat = location.getLatitude(); 
     finalLong = location.getLongitude(); 
     double distance = CalculationByDistance(initialLat, initialLong, finalLat, finalLong); 
     if(distance == 500){ 
      LocationUpdateServerCall locationUpdateServerCall = new LocationUpdateServerCall(getApplicationContext()); 
      locationUpdateServerCall.pushLocationUpdateServerCall(String.valueOf(finalLat), String.valueOf(finalLat)); 
     } 

    } 
} 

@Override 
public void onStatusChanged(String s, int i, Bundle bundle) { 

} 

@Override 
public void onProviderEnabled(String s) { 

} 

@Override 
public void onProviderDisabled(String s) { 

} 

public double CalculationByDistance(double initialLat, double initialLong, double finalLat, double finalLong) { 
/*PRE: All the input values are in radians!*/ 

    double latDiff = finalLat - initialLat; 
    double longDiff = finalLong - initialLong; 
    double earthRadius = 6371; //In Km if you want the distance in km 

    double distance = 2 * earthRadius * Math.asin(Math.sqrt(Math.pow(Math.sin(latDiff/2.0), 2) + Math.cos(initialLat) * Math.cos(finalLat) * Math.pow(Math.sin(longDiff/2), 2))); 

    return distance; 

} 

}

ответ

0

Вы можете использовать метод requestLocationUpdates с LocationManager. Это уменьшит вашу работу. Вот код.

//it will call every 1000 milisec and on more than 10m distance 

    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 10, new android.location.LocationListener() { 
       @Override 
       public void onLocationChanged(Location location) { 
        //Your API calls here 
       } 

       @Override 
       public void onStatusChanged(String s, int i, Bundle bundle) { 

       } 

       @Override 
       public void onProviderEnabled(String s) { 

       } 

       @Override 
       public void onProviderDisabled(String s) { 

       } 
    }); 
1

есть метод distanceTo, чтобы найти расстояние между loction.below является примером получения расстояния между местоположением на км; после получения заданного расстояния поставьте req для отправки позиции на сервер;

**location.distanceTo(location)/km)**