【问题标题】:Consistent Android Geofence Monitoring一致的 Android 地理围栏监控
【发布时间】:2017-03-05 15:03:29
【问题描述】:

我已经在一个应用中实现了一些地理围栏,并一直在使用我的测试设备(运行 Android 5.0.1 的三星 S4)上的模拟位置对其进行测试。在使用模拟位置时,转换检测一直在 100% 的时间内工作。我现在已经转移到其他 Android 设备上,并将应用程序放在一些经常(物理)进入和离开地理围栏位置的手机上,我注意到检测经常不起作用。这真的很不方便,所以我希望有一些方法可以使检测更加一致。

我的代码调用了要创建的地理围栏:

private void startGeofenceMonitoring() {
    Log.d(TAG, "startGeofenceMonitoring called");
    try {
        Geofence geofence = new Geofence.Builder()
                .setRequestId(GEOFENCE_ID)
                .setCircularRegion(51.364516, -0.189643, 150)
                .setExpirationDuration(Geofence.NEVER_EXPIRE)
                .setNotificationResponsiveness(1000)
                .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT)
                .build();

        GeofencingRequest geofencingRequest = new GeofencingRequest.Builder()
                .setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER | GeofencingRequest.INITIAL_TRIGGER_EXIT)
                .addGeofence(geofence)
                .build();

        Intent intent = new Intent(this, GeofenceService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        if (!googleApiClient.isConnected()) {
            Log.d(TAG, "GoogleApiClient is not connected");
        } else {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

                ActivityCompat.requestPermissions(MapsActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION);

                return;
            }
            LocationServices.GeofencingApi.addGeofences(googleApiClient, geofencingRequest, pendingIntent)
                    .setResultCallback(new ResultCallback<Status>() {
                        @Override
                        public void onResult(@NonNull Status status) {
                            if (status.isSuccess()) {
                                Log.d(TAG, "Successfully added Geofence");
                            } else {
                                Log.d(TAG, "Failed to add geofence - " + status.getStatus());
                            }
                        }
                    });
        }
    } catch (SecurityException e) {
        Log.d(TAG, "SecurityException - " + e.getMessage());
    }
} 

GeofenceService.java:

public class GeofenceService extends IntentService {

public static final String TAG = "GeofenceService";

DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference();

public GeofenceService() {
    super(TAG);
}

@Override
protected void onHandleIntent(Intent intent) {
    GeofencingEvent event = GeofencingEvent.fromIntent(intent);
    if (event.hasError()) {
        //TODO:
    } else {

        double longitude = 0;
        double latitude = 0;

        int transition = event.getGeofenceTransition();
        List<Geofence> geofences = event.getTriggeringGeofences();
        Geofence geofence = geofences.get(0);
        String requestID = geofence.getRequestId();

        longitude = event.getTriggeringLocation().getLongitude();
        latitude = event.getTriggeringLocation().getLatitude();

        final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

        if (longitude != 0 && latitude != 0) {

            if (transition == Geofence.GEOFENCE_TRANSITION_ENTER) {
                Log.d(TAG, "Entering geofence - " + requestID);

                //My on enter code

            } else if (transition == Geofence.GEOFENCE_TRANSITION_EXIT) {
                Log.d(TAG, "Exited geofence - " + requestID);
                //My on exit code
            }
        } else {

            mRootRef.child("users/" + user.getUid() + "/error").setValue("lat/long = 0");

        }
    }
}

我在网上看到说使用广播接收器比我做的更好,但令人尴尬的是,我还不够好,无法真正理解如何将我所做的转换为其他人的建议。

谢谢。

【问题讨论】:

    标签: android android-geofence


    【解决方案1】:

    查看这个答案,有一个带有地理围栏的广播接收器的实现

    Android Geofencing Notifications when app is closed

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多