Android如何知道地理围栏何时过期?

Posted

技术标签:

【中文标题】Android如何知道地理围栏何时过期?【英文标题】:Android how to know when Geofence has expired? 【发布时间】:2016-07-18 03:53:17 【问题描述】:

我已经使用 setExpirationDuration() 方法设置了我的地理围栏的过期时间。现在,我怎么知道我的地理围栏何时过期。有回调什么的吗?

我看过这个*** question,但我想不通。

【问题讨论】:

只是为了了解这个问题的一些背景信息,您为什么想知道地理围栏是否已过期?至于检查你的地理围栏是否已经过期,你有没有检查过 GeofencingRequest 类中的地理围栏列表,看看你的地理围栏是否还在列表中?根据文档,一旦过期,地理围栏就会被移除。 【参考方案1】:

目前不支持获取过期地理围栏或地理围栏列表的 api。

我看到两个选项:

    将存储地理围栏(例如在 SharedPreferences 中),然后每次您需要知道地理围栏是否过期时,只需遍历所有存储的地理围栏。

    将在地理围栏过期时安排意图。

选项 1) 的实施

我建议你创建一个可以在内部存储的类(例如在 SharedPreferences 中):

public class MyGeofence 
    private String id;
    private double latitude;
    private double longitude;
    private float radiusMeters;
    private int transitionType;
    private long expirationDurationMillis;

    public Geofence buildGeofence() 
        return new Geofence.Builder()
                .setCircularRegion(latitude, longitude, radiusMeters)
                .setRequestId(id)
                .setExpirationDuration(expirationDurationMillis)
                .setTransitionTypes(transitionType)
                .build();
    

    ...

所以当你想添加地理围栏时,你应该首先创建一个此类的对象,调用buildGeofence,使用LocationServices.GeofencingApi.addGeofences()添加它,然后存储它。

然后,当您想知道哪些地理围栏已过期时,您应该迭代所有存储的 MyGeofence 对象。

选项 2) 的实施

当您为地理围栏设置过期时间时,您还应该安排一个pendingIntent。

Intent notificationIntent = new Intent(this, MyBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

long futureInMillis = SystemClock.elapsedRealtime() + delay;
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);

记得在manifest中注册:

<receiver android:name=".MyBroadcastReceiver" />

【讨论】:

以上是关于Android如何知道地理围栏何时过期?的主要内容,如果未能解决你的问题,请参考以下文章

地理围栏如何比定期检查位置更准确?

多个圆圈上的传单地理围栏......检测内部/外部标记

如何在 Android 中创建地理围栏?

Android:如何让用户为其他被跟踪用户创建地理围栏?

Android:制作地理围栏的简单方法?

如何使用 Android 地理围栏 API?