Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Geofences not available and how to handle it

I'm working with geofences on android, it's all working fine on most phones, but on some of them, it's just not working (showing "geofences not available" in my error logs).

Some users don't have their location tracking enabled for Google Play Services. I think that is the reason why geofencing is not working on their phones. (right?)

Now I want a way to detect this. (inform the user and eventually show them how to fix it) I know there is a way to know wether google play services is available or not (and I already do this), but that doesn't say anything about the location services being enabled or not.

I know that I can check it while adding or removing geofence, there is an error code for it (geofence not available Location Status Codes), but that's not enough. Some users disable the location services after they added the geofences. Then I have no way of knowing this, and my app won't work. (complaining users etc.). At least I have to inform the user when they open the app to check what's wrong.

Does someone have an idea on how to do this? The best I can do now is adding and removing a dummy geofence on app boot, but there has to be a better way?

EDIT: I tested it with a device that had the issue, removing the app and reinstalling seems to fix the problem. I'm not doing anything special on the first boot, so this is really weird. It looks as if there is a problem with the google play services connection, and reinstalling the app does something special with these services. Is this possible? It gives no errors while connecting to them, but it did when I tried to set geofences (see above).

like image 737
Quentin Avatar asked Mar 20 '23 18:03

Quentin


1 Answers

The geofences will get disabled (and unregistered) if the GPS Provider or the Network Provider are disabled for whatever reason. That will cause your onAddGeofencesResult() to get called with an status code of error (1000). You can detect it right there.

Or, you detect this by implementing a Receiver that gets called in response to android.location.PROVIDERS_CHANGED. Remember to add the receiver to the AndroidManifest

<receiver android:name=".service.GeofenceProvidersChangedBroadcastReceiver">
    <intent-filter>
        <action android:name="android.location.PROVIDERS_CHANGED"/>
    </intent-filter>
</receiver>

On the receiver implementation, on its onReceive(), get the location manager and test for the providers status:

public class ProvidersChangedBroadcastReceiver extends WakefulBroadcastReceiver {

    :
    :

    @Override
    public void onReceive(Context context, Intent intent) {

        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            // GPS_PROVIDER IS enabled...
        } else {
            // GPS_PROVIDER is NOT enabled...
        }

        if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            // NETWORK_PROVIDER IS enabled...
        } else {
            // NETWORK_PROVIDER is NOT enabled...
        }

        :
        :
        :

        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) &&
        locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
        // We are good for geofencing as both GPS and Network providers are enabled....
    }

    :
    :
    :

}
like image 168
CEO Avatar answered Mar 31 '23 13:03

CEO