1

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

我在做什么

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

问题和困惑:

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

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

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

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

我正在按照这个来创建地理围栏。

请发表你的看法。

4

1 回答 1

0

您应该使用目标坐标(F 位)注册一个GEOFENCE_TRANSITION_ENTER或地理围栏。GEOFENCE_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)

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

使用 GeofencingRequest.Builder 构建 geofenceRequest 的位置:

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()即使应用程序关闭也会被调用。

希望能帮助到你。

于 2016-06-22T12:37:26.893 回答