While, it is recommended to get High Accuracy permission from your users for Geofence purposes. You can ensure providing a dialog for high accuracy from your user if is changed, similar to other location apps do as of now like uber or ola etc.
Something like this:
public void displayLocationSettingsRequest(final Activity activity, final int requestCode) {
final Task<LocationSettingsResponse> result = createLocationRequestForDialogDisplay(activity);
result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
@Override
public void onComplete(Task<LocationSettingsResponse> task) {
try {
LocationSettingsResponse response = task.getResult(ApiException.class);
if(!InventaSdk.locUpdateStarted) {
try {
initAndCheckEligibility(); //start location updates when all settings are satisfied
} catch (SecurityException s) {
P2pLogHelper.e(TAG, s.getMessage());
}
}
// All location settings are satisfied. The client can initialize location
// requests here.
} catch (ApiException exception) {
switch (exception.getStatusCode()) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the
// user a dialog.
try {
// Cast to a resolvable exception.
ResolvableApiException resolvable = (ResolvableApiException) exception;
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
resolvable.startResolutionForResult(
activity,
requestCode);
} catch (IntentSender.SendIntentException e) {
// Ignore the error.
} catch (ClassCastException e) {
// Ignore, should be an impossible error.
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings are not satisfied. However, we have no way to fix the
// settings so we won't show the dialog.
break;
}
}
}
});
}
private static Task<LocationSettingsResponse> createLocationRequestForDialogDisplay(Context context) {
// Create LocationSettingsRequest object using location request
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.setNeedBle(true);
builder.setAlwaysShow(true);
builder.addLocationRequest(createLocationRequest());
LocationSettingsRequest locationSettingsRequest = builder.build();
// Check whether location settings are satisfied
// https://developers.google.com/android/reference/com/google/android/gms/location/SettingsClient
SettingsClient settingsClient = LocationServices.getSettingsClient(context);
return settingsClient.checkLocationSettings(locationSettingsRequest);
}
Besides this, also if your users have WiFi available the accuracy is higher.
Having Wi-Fi on can significantly improve the location accuracy, so if Wi-Fi is turned off, your application might never get geofence alerts depending on several settings including the radius of the geofence, the device model, or the Android version. Starting from Android 4.3 (API level 18), we added the capability of “Wi-Fi scan only mode” which allows users to disable Wi-Fi but still get good network location. It’s good practice to prompt the user and provide a shortcut for the user to enable Wi-Fi or Wi-Fi scan only mode if both of them are disabled. Use SettingsClient to ensure that the device's system settings are properly configured for optimal location detection.
Source: https://developer.android.com/training/location/geofencing#Troubleshooting