2016-12-28 60 views
0

我的工作是geofence,我有问题GEOFENCE TRANSITION DWELL不是TriggerEnter and Exit Transition工作正常。我花了很多时间用google搜索,但发现我的问题太多了。我只想每隔一分钟向用户发送notification如果用户停留在geofence radius内。GEOFENCE TRANSITION DWELL不工作在android

这里是我的地理栅栏助手类:

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

您需要与输入沿设定的初始触发停留。
添加

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你的情况驻留(纯滞后)方法60秒后你进入一个地理围栏将被触发设定的时间。