Milan Gajera Milan Gajera - 3 months ago 10
JSON Question

How can i get the distance between the two longitude and two latitude in kilometer in android?

Explanation:
I know this question is mostly repeated but i have some bit of confusion. I am working on live application. In which, i read the JSON data in json there is some longitude and latitude are there. I fetch the compare with the current longitude and latitude. I found some methods and i tried but not got the expected output.

I want to compare when my current longitude and latitude is under the five kilemeters(km) from the json latitude and longitude. If the user is out of the range like more then a the five kilometer it's show the message user out of range.

Here, is my code to get the longtitude and latitude

public class HomeFragment extends Fragment implements ConnectionCallbacks, OnConnectionFailedListener,LocationListener{

public static final String TAG=TransactionFragment.class.getSimpleName();
public static final String KEY_UGC="postData[ugc]";
public static final String KEY_CUSTOMER_ID="postData[customerid]";
public static final String KEY_UGC_ID="postData[ugcid]";

View rootView;
PreferenceSetting prefManager;

ListView lvTransaction;
List<String> items;
TextView txtPoints;
Button btnUgc,btnMore;
List<Trasaction> trasactionList;
TextView lblTrasaction,lblStation,lblNoBottle,lblPointsColl,lblPoints;

int totalPoints=0;
MainActivity activity;

private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private double currentLatitude;
private double currentLongitude;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView=inflater.inflate(R.layout.fragment_home,container,false);

prefManager=PreferenceSetting.getInstance(getActivity());


mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
// The next two lines tell the new client that “this” current class will handle connection stuff
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
//fourth line adds the LocationServices API endpoint from GooglePlayServices
.addApi(LocationServices.API)
.build();

// Create the LocationRequest object
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(10 * 1000) // 10 seconds, in milliseconds
.setFastestInterval(1 * 1000); // 1 second, in milliseconds

activity=(MainActivity)getActivity();
lblTrasaction=(TextView)rootView.findViewById(R.id.lbl_trasaction);
lblTrasaction.setTypeface(AppController.fntAlice);

lblStation=(TextView)rootView.findViewById(R.id.lbl_station);
lblStation.setTypeface(AppController.fntVani);

lblNoBottle=(TextView)rootView.findViewById(R.id.lbl_no_bottle);
lblNoBottle.setTypeface(AppController.fntVani);

lblPointsColl=(TextView)rootView.findViewById(R.id.lbl_points_coll);
lblPointsColl.setTypeface(AppController.fntVani);

lblPoints=(TextView)rootView.findViewById(R.id.lbl_points);
lblPoints.setTypeface(AppController.fntVani);

btnUgc=(Button)rootView.findViewById(R.id.btn_ugc);
btnUgc.setTypeface(AppController.fntVani);

btnMore=(Button)rootView.findViewById(R.id.btn_more);
btnMore.setTypeface(AppController.fntVani);

txtPoints=(TextView)rootView.findViewById(R.id.txt_points);
txtPoints.setTypeface(AppController.fntVani);

if(prefManager.getPoints()==0){
txtPoints.setText("0");
}
else{
txtPoints.setText(""+prefManager.getPoints());
}
if(Utils.isNetworkConnected(getActivity())){
RequestParams params=new RequestParams();
params.put(ApiCalls.REQUEST_CASE_LABEL,"customerHistory");
params.put("postData[customerid]",prefManager.getCustomerId());
getTransactionApiCall(params);
}
else{
Toast.makeText(getActivity(),getString(R.string.internet), Toast.LENGTH_SHORT).show();
}


items=new ArrayList<>();

lvTransaction=(ListView)rootView.findViewById(R.id.lv_transaction);

btnMore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Message message=new Message();
Bundle bundle=new Bundle();
bundle.putString("more","1");
message.setData(bundle);
activity.uiHandler.sendMessage(message);
}
});
btnUgc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showDialog();
}
});
return rootView;
}

@Override
public void onResume() {
super.onResume();
mGoogleApiClient.connect();
}

@Override
public void onPause() {
super.onPause();
Log.v(this.getClass().getSimpleName(), "onPause()");

//Disconnect from API onPause()
if (mGoogleApiClient.isConnected()) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
mGoogleApiClient.disconnect();
}
}
@Override
public void onConnected(Bundle bundle) {
if (Build.VERSION.SDK_INT >= 21 &&
ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return ;
}
else {
Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

if (location == null) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

} else {
currentLatitude = location.getLatitude();
currentLongitude = location.getLongitude();
}
}
}

@Override
public void onConnectionSuspended(int i) {}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
if (connectionResult.hasResolution()) {
try {
connectionResult.startResolutionForResult(getActivity(), CONNECTION_FAILURE_RESOLUTION_REQUEST);

} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
} else {
Log.e("Error", "Location services connection failed with code " + connectionResult.getErrorCode());
}
}

@Override
public void onLocationChanged(Location location) {
currentLatitude = location.getLatitude();
currentLongitude = location.getLongitude();
}

public void getUcgCallApi(final RequestParams params){
AsyncHttpClient client=new AsyncHttpClient();
client.setTimeout(AsyncHttpClient.DEFAULT_SOCKET_TIMEOUT);
client.post(ApiCalls.API_CALL, params, new AsyncHttpResponseHandler() {

@Override
public void onStart() {
super.onStart();
Log.i(TAG,"GET UGC PARAMS:->>>"+params.toString());
}

@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
try{
String str=new String(responseBody);
JSONObject mainObj=new JSONObject(str);
Log.e(TAG,"SUCCESS RESPONSE:=>>"+mainObj.toString());

if(mainObj.has("status") && !mainObj.isNull("status")){
if(mainObj.getString("status").equalsIgnoreCase("Success")){
JSONArray data=mainObj.getJSONArray("data");

JSONObject dataObj=data.getJSONObject(0);

prefManager.setPkUgcId(dataObj.getString("PK_UGC_ID"));
prefManager.setUgcCode(dataObj.getString("UGC_CODE"));

if(!prefManager.getPkUgcId().equals(PreferenceSetting.DEFAULT)){
Log.e(TAG,"UGC ID STORED::"+prefManager.getPkUgcId()+"\nUGC CODE::->"+prefManager.getUgcCode());

Date timeDate=Utils.getDate(Long.parseLong(dataObj.getString("EXPIRED_TIME")));

Log.e(TAG,"DATE UTIL:->"+timeDate);
Date currentDate=new Date();

double LOCATION_LATITUDE=Double.parseDouble(dataObj.getString("LOCATION_LATITUDE"));
double LOCATION_LONGITUDE=Double.parseDouble(dataObj.getString("LOCATION_LONGITUDE"));

Log.e(TAG,"GETCURRENT TIME:->"+currentDate.toString());

if(timeDate.after(currentDate)){
Log.e(TAG,"FIRST DISTANCE:->"+distance(currentLatitude,currentLongitude,LOCATION_LATITUDE,LOCATION_LONGITUDE));
if((distance(currentLatitude,currentLongitude,LOCATION_LATITUDE,LOCATION_LONGITUDE)/1000) <= 5 ) {
Log.e(TAG,"AFTER DISTANCE:->"+distance(currentLatitude,currentLongitude,LOCATION_LATITUDE,LOCATION_LONGITUDE));
RequestParams reqParams = new RequestParams();
reqParams.put(ApiCalls.REQUEST_CASE_LABEL, "UGCReading");
reqParams.put(KEY_UGC, prefManager.getUgcCode());
reqParams.put(KEY_CUSTOMER_ID, prefManager.getCustomerId());
reqParams.put(KEY_UGC_ID, prefManager.getPkUgcId());
// readUgcCodeApiCall(reqParams);
}
else{
Toast.makeText(getActivity(), "“You are out of range for redeem", Toast.LENGTH_SHORT).show();
}
}
if(timeDate.before(currentDate)){
Toast.makeText(getActivity(), "UGC Code Expired", Toast.LENGTH_SHORT).show();
}
}
}
else{
Toast.makeText(getContext(), mainObj.getString("status"), Toast.LENGTH_SHORT).show();
}
}

}
catch (Exception e){
Log.e(TAG,"on Success()==>"+Log.getStackTraceString(e));
}
}

@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
try{
String str=new String(responseBody);
JSONObject mainObj=new JSONObject(str);

Log.e(TAG,"FAILURE RESPONSE:=>>"+mainObj.toString());
}
catch (Exception e){
Log.e(TAG,"on Failure()==>"+Log.getStackTraceString(e));
}
}
});
}

public void readUgcCodeApiCall(final RequestParams params){
AsyncHttpClient client=new AsyncHttpClient();
client.setTimeout(AsyncHttpClient.DEFAULT_SOCKET_TIMEOUT);
client.post(ApiCalls.API_CALL, params, new AsyncHttpResponseHandler() {

@Override
public void onStart() {
super.onStart();
Log.e(TAG,"PARAMS:->>>"+params.toString());
}

@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
try {
String str=new String(responseBody);
JSONObject mainObj=new JSONObject(str);
Log.e(TAG,"SUCCESS RESPONSE readUgcCodeApiCall :=>>"+mainObj.toString());

if(mainObj.has("status") && !mainObj.isNull("status")){
if(mainObj.getString("status").equalsIgnoreCase("Success")){
Toast.makeText(getActivity(),getString(R.string.success), Toast.LENGTH_SHORT).show();

RequestParams params=new RequestParams();
params.put(ApiCalls.REQUEST_CASE_LABEL,"customerHistory");
params.put("postData[customerid]",prefManager.getCustomerId());
getTransactionApiCall(params);
}
else{
Toast.makeText(getActivity(),getString(R.string.unsuccess), Toast.LENGTH_SHORT).show();
}
}

} catch (Exception e) {
Log.e(TAG,"on Success()==>"+Log.getStackTraceString(e));
}
}

@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
try {
String str=new String(responseBody);
JSONObject mainObj=new JSONObject(str);
Log.e(TAG,"FAILURE RESPONSE:=>>"+mainObj.toString());

} catch (Exception e) {
Log.e(TAG,"on Failure()==>"+Log.getStackTraceString(e));
}
}
});
}
private double distance(double lat1, double lon1, double lat2, double lon2) {
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
return (dist);
}

private double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
private double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}
public void showDialog(){

final Dialog dialog=new Dialog(getContext());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.claim_dialog);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.setCanceledOnTouchOutside(true);
dialog.setCancelable(true);

final EditText editClaim=(EditText)dialog.findViewById(R.id.edit_claim);
// editClaim.setTypeface(AppController.fntVani);
Button btnClaim=(Button)dialog.findViewById(R.id.btn_claim);
btnClaim.setTypeface(AppController.fntVani);

btnClaim.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

if(!editClaim.getText().toString().trim().equals("")) {

if (Utils.isNetworkConnected(getActivity())) {
RequestParams params=new RequestParams();
params.put(ApiCalls.REQUEST_CASE_LABEL,"getUGCDetails");
params.put(KEY_UGC,editClaim.getText().toString().trim());
getUcgCallApi(params);
if(dialog.isShowing()){
dialog.dismiss();
}

} else {
Toast.makeText(getContext(), getString(R.string.internet), Toast.LENGTH_SHORT).show();
}
}
}
});
dialog.show();
}
}


JSON RESPONSE

enter image description here

In above code there is a one method namely getUcgCallApi() in this i tried to compare old and current longitude and latitude.

Please help me to solve this problem.

Thanks in advance.

Answer

Try this for getting distance between two lat - long :

  float[] distance = new float[1];



  Location.distanceBetween(mLocation.latitude, mLocation.longitude, locations.latitude, locations.longitude, distance); 

The computed distance is stored in distance[0]. If distance has length 2 or greater, the initial bearing is stored in distance[1]. If distance has length 3 or greater, the final bearing is stored in distance[2].