我正在处理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);
}
答案 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());
对我来说很完美。