Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Geofencing Not Triggering in some mobile like OnePlus, Xiaomi etc

Am using Geo-fencing code under guidelines of Android document. Tested in Real device such as Sony XA1, Samsung J7 Nxt, Xiaomi 5A, Poco f1, OnePlus 6. Geo-fencing Enter and Exit are working Properly in Sony XA1, Samsung J7 Nxt.

Issues in Xiaomi & OnePlus Mobile.

  1. In Xiaomi 5A Some time Enter working properly but Exit not triggering.
  2. In Xiaomi Poco f1 Both Enter and Exit are not working.
  3. In OnePlus Mobile works only when app is open.

Geo-Fencing Code:

private GeofencingClient mGeofencingClient;
private ArrayList<Geofence> mGeofenceList;
private PendingIntent mGeofencePendingIntent;

mGeofenceList = new ArrayList<>();
mGeofencingClient = LocationServices.getGeofencingClient(getApplicationContext());

//Latitude & Longitude Comes from Array to Add
mGeofenceList.add(new Geofence.Builder().setRequestId(String.valueOf(mall.mallId)).setCircularRegion(
              mall.latitude,
              mall.longitude,
              mall.geofencingMeters)
             .setExpirationDuration(Geofence.NEVER_EXPIRE)
             .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT)
             .build());

private GeofencingRequest getGeofencingRequest() {

    GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
    builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
    builder.addGeofences(mGeofenceList);

    return builder.build();
}

private PendingIntent getGeofencePendingIntent() {
    if (mGeofencePendingIntent != null) {
        return mGeofencePendingIntent;
    }
    Intent intent = new Intent(this, GeofenceBroadcastReceiver.class);
    mGeofencePendingIntent = PendingIntent.getBroadcast(this, FENCING_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    return mGeofencePendingIntent;
}

BroadcastReceiver

public class GeofenceBroadcastReceiver extends BroadcastReceiver {

    /**
     * Receives incoming intents.
     *
     * @param context the application context.
     * @param intent  sent by Location Services. This Intent is provided to Location
     *                Services (inside a PendingIntent) when addGeofences() is called.
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        // Enqueues a JobIntentService passing the context and intent as parameters
        StoreFencing.enqueueWork(context, intent);
    }
  }
}

Fencing Service:

public class StoreFencing extends JobIntentService {

    private static final int JOB_ID = 502;
    List<Geofence> triggeringGeofences;

    public static void enqueueWork(Context context, Intent intent) {
        enqueueWork(context, StoreFencing.class, JOB_ID, intent);
    }

    @Override
    protected void onHandleWork(@NonNull Intent intent) {

        GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
        if (geofencingEvent.hasError()) {

            return;
        }

        int geofenceTransition = geofencingEvent.getGeofenceTransition();

        if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER) {

            triggeringGeofences = geofencingEvent.getTriggeringGeofences();
            getGeofenceEnterTransitionDetails(triggeringGeofences);

        }

        if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {

            triggeringGeofences = geofencingEvent.getTriggeringGeofences();
            getGeofenceExitTransitionDetails(triggeringGeofences);

        }

    }
}

Is there any problem in Code or Device. Inform users to enable additional setting in these mobile. Help to Solve this Issue.

like image 781
Yugesh Avatar asked Oct 27 '25 03:10

Yugesh


1 Answers

Yes, I have also experienced these issues.

  1. On One Plus devices, battery optimization for your app must be disabled, i.e. it must be set to 'Dont optimize' in the Settings > Battery > All apps > YourApp. Only then it will work when your app is in background or not even in background.

  2. On Xiaomi devices, your app must have auto-start permission enabled in the settings for geofencing to work correctly.

  3. Most other Chinese devices such as Lenovo, Coolpad, etc. have also not triggering any geofence transition events after the app has been killed from the recents.

You can redirect the user to the specific page in settings and tell them to enable/disable them for geofencing to work correctly.

Other than that I have not found any solution.

Also you can check these Geofence Troubleshing

like image 158
Ashwin Avatar answered Oct 30 '25 16:10

Ashwin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!