Android 地理围栏在某些手机(如 OnePlus、小米等)中未触发

Yug*_*esh 4 android android-geofence

我根据 Android 文档的指导原则使用地理围栏代码。在索尼 XA1、三星 J7 Nxt、小米 5A、Poco f1、OnePlus 6 等真实设备中进行测试。地理围栏进入退出在索尼 XA1、三星 J7 Nxt 中正常工作。

小米OnePlus手机的问题。

  1. 在小米5A中,有时Enter工作正常,但Exit不触发。
  2. 在小米 Poco f1 中,EnterExit均不起作用。
  3. 在 OnePlus Mobile 中,仅当应用程序打开时才有效。

地理围栏代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

广播接收器

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

击剑服务:

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);

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

代码或设备是否有问题。通知用户在这些手机中启用其他设置。帮助解决这个问题。

Ash*_*win 5

是的,我也经历过这些问题。

  1. 在 OnePlus 设备上,必须禁用应用程序的电池优化,即必须在“设置”>“电池”>“所有应用程序”>“YourApp”中将其设置为“不优化”。只有这样,当您的应用程序处于后台或什至不在后台时,它才会工作。

  2. 在小米设备上,您的应用程序必须在设置中启用自动启动权限才能使地理围栏正常工作。

  3. 大多数其他中国设备,例如联想、酷派等,在最近的应用程序被杀死后也没有触发任何地理围栏转换事件。

您可以将用户重定向到设置中的特定页面,并告诉他们启用/禁用它们以使地理围栏正常工作。

除此之外我还没有找到任何解决方案。

您还可以检查这些地理围栏故障排除