地理围栏最佳策略

Posted

技术标签:

【中文标题】地理围栏最佳策略【英文标题】:GeoFencing Best Stratigies 【发布时间】:2016-09-29 13:34:31 【问题描述】:

我正在研究位置和地理围栏。但我已经看到了几个问题。我认为我遗漏了一些东西,但实际上我对地理围栏和定位服务(例如 Fused Location API)有很多困惑。

我在做什么

根据我的应用场景,我必须获取用户位置(我正在使用 Fused Location API 获取),并且我已经询问用户他的目的地是什么,假设他在 A 点并且他选择了 F 点. 现在我希望我的应用程序应该通知他他已经到达 F 点。

问题和困惑:

    只有当我在我的应用程序中时,我才会(通过我的通知)收到我已到达目的地的通知。看起来我的位置没有将谷歌更新到我当前的位置。那么如果应用程序关闭或在后台谷歌仍然跟踪他,那么最好的方法是什么

    我正在做的是在用户目的地周围创建地理围栏。现在我不知道谷歌跟踪用户的方式是什么。 ?你能告诉我在创建地理围栏后谷歌如何跟踪我们吗?

    我是否需要在服务中实现一些东西,以便在我的应用程序处于后台甚至我的应用程序被强制关闭时我的服务应该保持运行?

我想我很清楚我的问题是我想要什么。请分享您的观点,并告诉我当我们对任何位置进行地理围栏时,谷歌如何跟踪我们?

我正在关注this 创建地理围栏。

请发表你的看法。

【问题讨论】:

请阅读官方文档 【参考方案1】:

您应该使用目标坐标(F 位)注册GEOFENCE_TRANSITION_ENTERGEOFENCE_TRANSITION_DWELL 地理围栏。

在您的 Activity/Fragment onCreate 中,您应该创建 Api 客户端:

mGoogleApiClient = new GoogleApiClient.Builder(this)
                                      .addConnectionCallbacks(this)
                                      .addOnConnectionFailedListener(this)
                                      .addApi(LocationServices.API)
                                      .build();

还要记得连接/断开:

protected void onStart() 
    mGoogleApiClient.connect();
    super.onStart();


protected void onStop() 
    mGoogleApiClient.disconnect();
    super.onStop();

然后在onConnected 中你应该执行以下操作:

LocationServices.GeofencingApi.addGeofences(mGoogleApiClient,
                                            geofenceRequest,
                                            pendingIntent)

您应该只添加一次地理围栏。

geofenceRequest 是使用 GeofencingRequest.Builder 构建的:

geofenceRequest = new GeofencingRequest.Builder().addGeofence(yourGeofence).build()

你的Geofence和pendingIntent在哪里:

yourGeofence = new Geofence.Builder()....build(); // Here you have to set the coordinate of Place F and GEOFENCE_TRANSITION_ENTER/GEOFENCE_TRANSITION_DWELL
pendingIntent = PendingIntent.getService(this,
                                         (int)(System.currentTimeMillis()/1000),
                                         new Intent(this, GeofenceTransitionsIntentService.class),
                                         PendingIntent.FLAG_UPDATE_CURRENT);

GeofenceTransitionsIntentService 可能是这样的:

public class GeofenceTransitionsIntentService extends IntentService 
    @Override
    protected void onHandleIntent(Intent intent) 
        GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);

        if (!geofencingEvent.hasError()) 
            int geofenceTransition = geofencingEvent.getGeofenceTransition();
            if (geofenceTransition != -1) 
                List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();
                if (triggeringGeofences != null && triggeringGeofences.size() > 0) 
                    Geofence geofence = triggeringGeofences.get(0);
                    // Do something with the geofence, e.g. show a notification using NotificationCompat.Builder
                
            
        
    

记得在你的清单中注册这个服务:

<service android:name=".GeofenceTransitionsIntentService"/>

GeofenceTransitionsIntentService.onHandleIntent() 即使应用关闭也会被调用。

希望对你有帮助。

【讨论】:

感谢详细信息!!当 mGoogleApiClient.disconnect(); 调用 GPS 跟踪停止(我们可以在通知中看到)所以我们永远不知道 Google Play 服务何时更新用户位置,我想我们需要使用 GCMnwmanager /Jobschedular api 每 30 秒或 1 分钟更新一次位置触发器以获取位置更新以触发地理围栏触发器,您有什么建议吗? 我没有看到任何记录或修改频率的方法,这是由操作系统处理的,我想你应该依赖它。如果这对您的用例来说还不够,那么我猜您不应该使用地理围栏 API,而是使用应该请求用户位置的后台服务手动执行此操作,请注意,我猜这可能会耗尽您的手机电池。

以上是关于地理围栏最佳策略的主要内容,如果未能解决你的问题,请参考以下文章

《TableStore最佳实践:轻松实现轨迹管理与地理围栏》

HMS Core地理围栏能力助你实现指定范围人群的精准消息推送

地理围栏是不是可以包含许多其他地理围栏

在 Google 的地理围栏教程中没有看到地理围栏转换

实施地理围栏 - 在应用程序未运行时接收地理围栏转换事件

HMS Core地理围栏能力助你实现指定范围人群的精准消息推送