I have a saved geo location(latitude,longitude).when a user presses a action button in app, the current location is recorded.
I want to check if the current latitude,longitude(which I have) falls in a circular geofence (who's center geo point I have ).
I don't want to create a geofence on Google map. I just want to check if a geolocation falls in a geofence.
The code I use to get current geolocation when the accuracy is less than 20 :
public class CreatePlaceActivity extends Fragment implements
OnClickListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener {
private Button cancelBtn, submitBtn;
public boolean geoLocationCheck = false;
private String TAG = "CreatePlaceActivity";
public CreatePlaceActivity() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.create_place_screen,
container, false);
submitBtn = (Button) rootView.findViewById(R.id.submit_btn_id);
submitBtn.setTypeface(typeface);
submitBtn.setOnClickListener(this);
cancelBtn = (Button) rootView.findViewById(R.id.cancel_btn_id);
cancelBtn.setOnClickListener(this);
setlocationClient();
return rootView;
}
private void setlocationClient() {
int resp = GooglePlayServicesUtil
.isGooglePlayServicesAvailable(getActivity());
if (resp == ConnectionResult.SUCCESS) {
locationclient = new GoogleApiClient.Builder(getActivity())
.addApi(LocationServices.API).addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
locationclient.connect();
} else {
GooglePalyErrorDialogIsShowing = true;
Toast.makeText(getActivity(),// CreatePlaceActivity.this,
"Google Play Service Error " + resp, Toast.LENGTH_LONG)
.show();
if (alert == null) {
onLocationChangedbuilder = new AlertDialog.Builder(
getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
} else if (alert.isShowing()) {
alert.dismiss();
onLocationChangedbuilder = new AlertDialog.Builder(
getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
}
onLocationChangedbuilder
.setTitle("Alert!")
.setMessage("Google Play Service Error " + resp)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
locationLockDialogIsShowing = false;
GooglePalyErrorDialogIsShowing = false;
((MenuActivity) getActivity())
.removeFragment(CreatePlaceActivity.this);
}
});
alert = onLocationChangedbuilder.create();
alert.setCancelable(false);
try {
alert.show();
} catch (Exception e) {
}
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.submit_btn_id:
Log.i(TAG, "lat=" + currentGeoLocation.getLatitude() + "lon="
+ currentGeoLocation.getLongitude() + "acc="
+ currentGeoLocation.getAccuracy() + "alt="
+ currentGeoLocation.getAltitude());
validatePlace();
break;
case R.id.cancel_btn_id:
// finish();
((MenuActivity) getActivity())
.removeFragment(CreatePlaceActivity.this);
break;
default:
break;
}
}
@Override
public void onLocationChanged(Location location) {
float accuracy = 50;
// DateTime dt1 = new DateTime();
// DateTimeFormatter fmt1 = ISODateTimeFormat.dateTime();
Time time = new Time();
time.setToNow();
String strdt = String.valueOf(time.toMillis(false));
if (location != null) {
accuracy = location.getAccuracy();
locationLockDialogIsShowing = true;
if (globalAccuracy - location.getAccuracy() >= 20
|| globalAccuracy - location.getAccuracy() >= -20) {
globalAccuracy = location.getAccuracy();
}
}
if (alert == null) {
onLocationChangedbuilder = new AlertDialog.Builder(getActivity(),
AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
} else if (alert.isShowing()) {
alert.dismiss();
onLocationChangedbuilder = new AlertDialog.Builder(getActivity(),
AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
}
final float accr = accuracy;
onLocationChangedbuilder
.setTitle("Alert!")
.setMessage(
"Getting the best possible location..Please wait.\nCurrent Accuracy is "
+ accuracy)
.setPositiveButton("Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
locationLockDialogIsShowing = false;
if (locationclient != null) {
locationclient.disconnect();
}
Time time = new Time();
time.setToNow();
String strdt = String.valueOf(time
.toMillis(false));
if (alert == null) {
} else if (alert.isShowing()) {
alert.dismiss();
}
if (locationLockAlert == null) {
} else if (locationLockAlert.isShowing()) {
locationLockAlert.dismiss();
}
// setResult(RESULT_OK);
// finish();
((MenuActivity) getActivity())
.removeFragment(CreatePlaceActivity.this);
}
});
alert = onLocationChangedbuilder.create();
alert.setCancelable(false);
try {
alert.show();
} catch (Exception e) {
}
if (location.getAccuracy() <= 16) {
DateTime dt = new DateTime();
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
String str1 = fmt.print(dt);
locationLockDialogIsShowing = false;
Time timeNow = new Time();
timeNow.setToNow();
String str = String.valueOf(timeNow.toMillis(false));
// locationLockTimestamp = str1;
// TODO
currentGeoLocation = location;
if (locationclient != null) {
if (locationclient.isConnected()) {
LocationServices.FusedLocationApi.removeLocationUpdates(
locationclient, this);
locationclient.disconnect();
}
}
if (alert.isShowing()) {
alert.dismiss();
}
if (locationLockAlert != null) {
if (locationLockAlert.isShowing()) {
locationLockAlert.dismiss();
}
}
showDialog("Alert!",
"GPS Location locked.. You can now continue to create place");
}
}
@Override
public void onConnectionFailed(ConnectionResult result) {
// TODO Auto-generated method stub
}
@Override
public void onConnected(Bundle connectionHint) {
// TODO Auto-generated method stub
final float accuracy = 250;
if (locationclient != null && locationclient.isConnected()) {
if (geoLocationCheck == false) {
locationrequest = LocationRequest.create();
locationrequest
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationrequest.setInterval(100);
// locationclient.requestLocationUpdates(locationrequest, this);
LocationServices.FusedLocationApi.requestLocationUpdates(
locationclient, locationrequest, this);
locationLockDialogIsShowing = true;
if (alert == null) {
onLocationChangedbuilder = new AlertDialog.Builder(
getActivity(),
AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
} else if (alert.isShowing()) {
alert.dismiss();
onLocationChangedbuilder = new AlertDialog.Builder(
getActivity(),
AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
}
onLocationChangedbuilder
.setTitle("Alert!")
.setMessage(
"Getting the best possible location..Please wait.\nCurrent Accuracy is "
+ accuracy)
.setPositiveButton("Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
locationLockDialogIsShowing = false;
if (locationclient != null) {
locationclient.disconnect();
}
Time time = new Time();
time.setToNow();
String strdt = String.valueOf(time
.toMillis(false));
if (alert == null) {
} else if (alert.isShowing()) {
alert.dismiss();
}
if (locationLockAlert == null) {
} else if (locationLockAlert
.isShowing()) {
locationLockAlert.dismiss();
}
// setResult(RESULT_OK);
// finish();
((MenuActivity) getActivity())
.removeFragment(CreatePlaceActivity.this);
}
});
alert = onLocationChangedbuilder.create();
alert.setCancelable(false);
try {
alert.show();
} catch (Exception e) {
}
}
}
}
@Override
public void onConnectionSuspended(int arg0) {
Log.i("fused", "loc client onConnectionSuspended");
}
public Dialog showDialog(String title, String msg) {
locationLockAlert = new AlertDialog.Builder(getActivity(),
AlertDialog.THEME_DEVICE_DEFAULT_LIGHT).create();
locationLockAlert.setTitle(title);
locationLockAlert.setMessage(msg);
locationLockAlert.setButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
locationLockAlert.dismiss();
}
});
try {
locationLockAlert.show();
} catch (Exception e) {
}
return locationLockAlert;
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
}
Link I have referred is Android Geofencing (Polygon)
Thanks!
If you know the radius of the circle and its center point, you know if any other point is inside the circle by using the following formula:
which is the distance formula.
Also, if both points are Location
objects. you can use Location.distanceTo