我正在使用geofence,但在GEOFENCE TRANSITION DWELL正常工作时遇到与Trigger而不是Enter and Exit Transition有关的问题。我花了很多时间在谷歌上搜索,但是发现我的问题太多了。我只想每隔一分钟向用户发送notification如果用户停留在geofence radius之内。

这是我的Geofence帮助程序类:

public class GeofenceHelper {

private Context mContext;
private GeofencingRequest geoFencingRequest;
private Intent intent;
private PendingIntent pendintIntent;

public GeofenceHelper(Context mContext) {
    this.mContext = mContext;
}

public void addGeofence(List<ExcelDataModel> excelDataModel, ResultCallback<Status> statusResultCallback) {
    List<Geofence> geofenceList = new ArrayList<>();
    for (ExcelDataModel dataModel : excelDataModel) {
        if (!TextUtils.isEmpty(dataModel.getLatitude()) && !TextUtils.isEmpty(dataModel.getLongitude()) && !TextUtils.isEmpty(dataModel.getRadius())) {
            Geofence geofence = new Geofence.Builder()
                    .setRequestId(String.valueOf(dataModel.getId()))
                    .setCircularRegion(Double.parseDouble(dataModel.getLatitude()), Double.parseDouble(dataModel.getLongitude()), Float.parseFloat(dataModel.getRadius()))
                    .setExpirationDuration(Geofence.NEVER_EXPIRE)
                    .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT | Geofence.GEOFENCE_TRANSITION_DWELL)
                    .setLoiteringDelay(60000)
                    .build();

            geofenceList.add(geofence);
        }
    }

    if (geofenceList.size() < 1){
        Toast.makeText(mContext, "NO valid geofence.", Toast.LENGTH_SHORT).show();
        return;
    }

    geoFencingRequest = new GeofencingRequest.Builder()
            .setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER)
            .addGeofences(geofenceList)
            .build();


    intent = new Intent(mContext, GeofenceService.class);
    intent.putExtra(GeofenceService.EXTRA_ID, 12);
    pendintIntent = PendingIntent.getService(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    LocationServices.GeofencingApi
            .addGeofences(App.getGoogleApiHelper().googleApiClient, geoFencingRequest, pendintIntent)
            .setResultCallback(statusResultCallback);

    Toast.makeText(mContext, "Total Geofences: " + geofenceList.size(), Toast.LENGTH_SHORT).show();

}
}


这是我的地理围栏服务类:

public class GeofenceService extends IntentService {

public static final String TAG = GeofenceService.class.getSimpleName();
public static String EXTRA_ID = "extra_id";


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return super.onStartCommand(intent, flags, startId);
}

public GeofenceService() {
    super(TAG);
}

@Override
protected void onHandleIntent(Intent intent) {
    GeofencingEvent event = GeofencingEvent.fromIntent(intent);
    if (event.hasError()) {
        Toast.makeText(this, "Goefence Error: " + event.getErrorCode(), Toast.LENGTH_SHORT).show();
    } else {
        int transition = event.getGeofenceTransition();
        Log.d(TAG, "onHandleIntent: " + transition);
        List<Geofence> geofences = event.getTriggeringGeofences();

        Geofence geofence = geofences.get(0);
        String requestId = geofence.getRequestId();

        ExcelDataModel excelData = App.getDatabaseAdapter().getRecordById(requestId);
        CategoryModel categoryModel = App.getDatabaseAdapter().getCategoryById(excelData.getCategory());

        if (transition == Geofence.GEOFENCE_TRANSITION_ENTER) {

            if (categoryModel.getStatus() == 1){

                sendNotification(excelData.getName(),excelData.getNotificationMessage());
            }
            App.getDatabaseAdapter().addOrUpdateNOtificaion(new NotificationModel(requestId, excelData.getName(), excelData.getNotificationMessage(), getDateTime()));

        }else if (transition == Geofence.GEOFENCE_TRANSITION_EXIT){

            if (categoryModel.getStatus() == 1) {
                sendNotification(excelData.getName(), "Exit Geofence");
            }

            App.getDatabaseAdapter().addOrUpdateNOtificaion(new NotificationModel(requestId, excelData.getName(), excelData.getNotificationMessage(), getDateTime()));
        } else if (transition == Geofence.GEOFENCE_TRANSITION_DWELL) {
            Log.d(TAG, "DWELL geofence- " + requestId);
            if(categoryModel.getStatus() == 1) {
                sendNotification(excelData.getName(), "Hello buddy You are still here!!");
            }

            App.getDatabaseAdapter().addOrUpdateNOtificaion(new NotificationModel(requestId, excelData.getName(), excelData.getNotificationMessage(), getDateTime()));

        }
    }
}

public void sendNotification(String title, String mess) {

    Intent ii = new Intent(this, MainActivity.class);
    ii.putExtra("check",R.id.notification_id);
    PendingIntent pi = PendingIntent.getActivity(this, 0, ii, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder ncompat = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_notifications_active_black_24dp)
            .setContentTitle(title)
            .setContentText(mess)
            .setContentIntent(pi)
            .setDefaults(Notification.DEFAULT_VIBRATE)
            .setAutoCancel(true);
    Notification notification = ncompat.build();
    NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    nm.notify(0, notification);
}

最佳答案

您需要与Enter一起设置暂停的初始触发器。


  GeofencingRequest.INITIAL_TRIGGER_DWELL


在您的geoFencingRequest中。

    geoFencingRequest = new GeofencingRequest.Builder()
        .setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER|GeofencingRequest.INITIAL_TRIGGER_DWELL)
        .addGeofences(geofenceList)
        .build();


注意:仅当您输入地理围栏并在setLoiteringDelay(timedelay)方法中设置的时间内停留在内部时,才会调用Geofence.GEOFENCE_TRWELLTION_DWELL,在您输入地理围栏60秒后才会触发。

09-07 18:42