Лучшие стратегии геозоны

Я работаю над определением местоположения и гео-фехтованием. Но я видел пару проблем. Я думаю, что я что-то упустил, но на самом деле у меня много путаницы в отношении сервисов Geo Fencing и Location, таких как Fused Location API.

Что я делаю

Согласно моему сценарию приложения, я должен получить местоположение пользователя (которое я получаю с помощью API Fused Location), а также я спрашиваю пользователя, каков его пункт назначения, и пусть говорит, что он находится в точке A, и он выбирает место F. Теперь я хочу, чтобы Мое приложение уведомило его о том, что он прибыл в точку F.

Проблемы и путаница:

  1. Я уведомлен (посредством моего уведомления), что я прибыл в пункт назначения, только и только если я нахожусь в своем приложении. похоже, что мое местоположение не обновляло Google до моего текущего местоположения. так что это лучший способ, чтобы, если приложение близко или в фоновом режиме Google все еще отслеживать его

  2. Что я делаю, так это создаю геозону вокруг пункта назначения пользователя. Теперь я не знаю, как Google может отслеживать пользователя. ? не могли бы вы объяснить мне, что после создания геозоны, как Google отслеживает нас?

  3. Нужно ли мне что-то реализовать в сервисе, чтобы мой сервис продолжал работать, если мое приложение находится в фоновом режиме или даже мое приложение принудительно закрыто?

Я думаю, что я совершенно ясно ответил на свой вопрос, что я хочу. Пожалуйста, поделитесь своим мнением, а также скажите мне, как Google отслеживает нас, когда мы геозонируем какое-либо местоположение?

Я использую это для создания геозоны.

Пожалуйста, поделитесь своими взглядами.


person developerAndroid    schedule 31.05.2016    source источник
comment
пожалуйста, прочитайте официальный документ   -  person Coas Mckey    schedule 01.06.2016


Ответы (1)


Вы должны зарегистрировать геозону GEOFENCE_TRANSITION_ENTER или GEOFENCE_TRANSITION_DWELL с координатами цели (место F).

В вашем 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()

Где yourGeofence и 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() будет вызываться, даже если приложение закрыто.

Надеюсь, поможет.

person fernandospr    schedule 22.06.2016
comment
Спасибо за подробную информацию!! при вызове mGoogleApiClient.disconnect(); GPS-отслеживание прекращается (мы можем видеть это в уведомлении). Поэтому мы никогда не знаем, когда сервис Google Play, как часто обновляет местоположение пользователя, я думаю, нам нужно работать с GCMnwmanager. /Jobschedular API для обновления триггера местоположения каждые 30 секунд или 1 минуту, чтобы получить обновление местоположения для срабатывания триггера Geofence, какие-либо предложения от вас? - person LOG_TAG; 21.10.2016
comment
Я не видел никакого задокументированного способа узнать или изменить частоту, это обрабатывается ОС, и я думаю, вы должны полагаться на нее. Если этого недостаточно для вашего варианта использования, я думаю, вам не следует использовать API-интерфейс геозоны и делать это вручную, используя фоновую службу, которая должна запрашивать местоположение пользователя, имейте в виду, что это, вероятно, разрядит батарею вашего телефона. - person fernandospr; 21.10.2016