GEOFENCE TRANSITION DWELL在android中不起作用

时间:2016-12-28 05:44:35

标签: android android-geofence

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

这是我的地理围栏助手类:

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

2 个答案:

答案 0 :(得分:3)

您需要设置停留的初始触发器以及输入。
添加

  

GeofencingRequest.INITIAL_TRIGGER_DWELL

在你的geoFencingRequest中。

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

注意:Geofence.GEOFENCE_TRANSITION_DWELL仅在您输入地理围栏并且在您设置的setLoiteringDelay(timedelay)方法中保持在内部时调用,在您输入地理围栏60秒后将触发停留。

答案 1 :(得分:1)

以防有人仍然遇到此问题。

google geofence中有一个令人误解的代码段 documentation 如果您使用摘要通过广播接收器激活地理围栏通知,

您需要确保兴趣转移包括:

geofenceTransition == Geofence.GEOFENCE_TRANSITION_DWELL

// Test that the reported transition was of interest.
if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER ||
    geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT ||
    geofenceTransition == Geofence.GEOFENCE_TRANSITION_DWELL ) {
    ...

文档中的代码段不包含DWELL选项。

DWELL选项的地理围栏生成器应如下所示:

geofenceList.add(new Geofence.Builder()
        .setRequestId("geofence1")
        .setCircularRegion(
                latitude, //lat
                longitude, //lon
                radius // radius
        )
        .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_DWELL)
        .setLoiteringDelay(10000) //10 seconds for staying in geofence
        .setExpirationDuration(Geofence.NEVER_EXPIRE)
        .build()); 

对我来说很完美。