2013-05-22 6 views
3

мне нужна некоторая ясность в примере коде, поставляемой с Геозонами руководства, как размещено здесь:Нового Android Геозоны Апи - Пример кода не предупреждение/уведомления при на месте

https://developer.android.com/training/location/geofencing.html

Я побежал код, и я вижу что геообъекты создаются правильно, но то, что я действительно хочу, - это способ получить предупреждение, когда я направляюсь в эти геотермические местоположения. Прямо сейчас, когда я прохожу мимо этих точек с геофоном, ничего не происходит (ReceiveTransitionsIntentService не вызывается), никаких уведомлений нет.

Должен ли я также слушать периодические обновления местоположения и передавать lat/lng на вышеуказанный фрагмент кода вручную, чтобы указать мое текущее местоположение? Я думал, что это должно быть автоматически, когда я добавляю геообъекты в LocationClient, но я думаю, что их больше. не

Я также попытался регистрацией LocationRequest к экземпляру LocationClient, но до сих пор нет предупреждений:

mLocationRequest = LocationRequest.create(); 
mLocationRequest.setInterval(LocationUtils.UPDATE_INTERVAL_IN_MILLISECONDS); 
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
mLocationRequest.setFastestInterval(LocationUtils.FAST_INTERVAL_CEILING_IN_MILLISECONDS); 

mLocationClient.requestLocationUpdates(mLocationRequest, (LocationListener)mActivity); 

Как один интегрирует Geofence ИПНЫ с отслеживанием местоположения?

+0

Что такое радиус вашей геофенсации? Запускаете ли вы свой привод в радиусе геозонности? Уведомление возникает только при переходе геозоны по заданному радиусу не тогда, когда вы «проходите мимо» геофонного пятна. – paulkayuk

+0

Я установил радиус 500 м, я перехожу через эту геозонность, но мне не повезло получить уведомление. Я увеличил радиус до 2000 м, но при этом ReceiveTransitionsIntentService не вызван. –

+0

Одна вещь, которую я заметил при запуске примера кода, заключается в том, что, когда я уже в геофоруме, и я добавляю геозонность к LocationClient, уведомление происходит. Но если я нахожусь снаружи, когда добавляю геозонность, а позже я вожу в геозонность, тогда ничего не происходит, его чистое радиомолчание. –

ответ

1

Некоторые быстрые заметки. Убедитесь, что у вас есть соответствующие переходы. Возможно, вы захотите установить вход и переход на выход.

Фрагмент кода для Geofencing не отображает уведомление. Это преднамеренно; уведомления не всегда являются наилучшим ответом на переход. Образец приложение отображает уведомление, и вы можете увидеть это, если вы загрузите образец.

Услуги по размещению делают все возможное, чтобы определить ваше местоположение.

Также помните, что вы должны запросить ACCESS_FINE_LOCATION.

Вы не найдете ничего конкретного относительно отслеживания геозонности (или всего остального, связанного с местоположением) в фоновом режиме. Все это входит в сервисы Google Play.

0

Обратите внимание на пример содержит ошибку, которая сделает ваши заборы истекает через 12 минут вместо предполагаемых 12 часов ... Чтобы исправить изменить

private static final long SECONDS_PER_HOUR = 60; 

в

private static final long SECONDS_PER_HOUR = 60*60; 

в MainActivity

1

@andrewmolo У меня была такая же проблема, когда я пробовал. Вы должны настроить правильный путь сборки и библиотеку для своего проекта. Он работал для меня, когда я настраивал следующее.

  1. Перейти к категории Недвижимость вашего проекта> Android> Выбрать Google API.
  2. Свойства> Путь сборки Java> Библиотеки.

Убедитесь, что вы имеете

 1. android-support-v4.jar 
    2. Google APIs 
    3. google-play-services_lib.jar 
    4. google-play-services.jar 

Кроме того, и экспорта вы должны иметь API Google, на самом нижнем положении и все остальные выбраны.

1

У меня были некоторые проблемы с образцом кода. Вот что сработало для меня.

  latitude = sharedPreferences.getFloat("storeAddress_lat", -1); 
      longitude = sharedPreferences.getFloat("storeAddress_lng", -1); 

      final ArrayList<Geofence> list = new ArrayList<Geofence>(); 

      Builder builder = new Geofence.Builder(); 
      builder.setRequestId("near_store_geofence"); 
      builder.setCircularRegion(latitude, longitude, 50); 
      builder.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER); 
      builder.setExpirationDuration(Geofence.NEVER_EXPIRE); 
      list.add(builder.build()); 

      builder = new Geofence.Builder(); 
      builder.setRequestId("leave_store_geofence"); 
      builder.setCircularRegion(latitude, longitude, 50); 
      builder.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_EXIT); 
      builder.setExpirationDuration(Geofence.NEVER_EXPIRE); 
      list.add(builder.build()); 


      final GooglePlayServicesClient.ConnectionCallbacks connectionCallbacks = new GooglePlayServicesClient.ConnectionCallbacks(){ 

       @Override 
       public void onConnected(Bundle connectionHint) { 
        Log.i("GEOFENCE","onConnected"); 


        // Create an explicit Intent 
        Intent intent = new Intent(getBaseContext(), ReceiveTransitionsIntentService.class); 
        /* 
        * Return the PendingIntent 
        */ 
        PendingIntent pendingIntent = PendingIntent.getService(
          getBaseContext(), 
          0, 
          intent, 
          PendingIntent.FLAG_UPDATE_CURRENT); 

        locationClient.addGeofences(list,pendingIntent, new OnAddGeofencesResultListener(){public void onAddGeofencesResult(int statusCode, String[] geofenceRequestIds) { 
         Log.i("GEOFENCE","onAddGeofencesResult"); 
        }}); 

        LocationRequest locationrequest = LocationRequest.create(); 
        locationrequest.setPriority(locationrequest.PRIORITY_HIGH_ACCURACY); 
        locationrequest.setInterval(5000); 

        locationClient.requestLocationUpdates(locationrequest, new LocationListener(){ 

         @Override 
         public void onLocationChanged(Location location) { 
          // TODO Auto-generated method stub 

         }}); 


       } 

       @Override 
       public void onDisconnected() { 
        Log.i("GEOFENCE","onDisconnected");      
       } 
      }; 
      GooglePlayServicesClient.OnConnectionFailedListener onConnectionFailedListener = new GooglePlayServicesClient.OnConnectionFailedListener(){ 

       @Override 
       public void onConnectionFailed(ConnectionResult result) { 
        Log.i("GEOFENCE","onConnectionFailed"); 

       } 
      }; 
      locationClient = new LocationClient(getBaseContext(), connectionCallbacks, onConnectionFailedListener); 

      locationClient.connect(); 
1

GPS никогда не включаются в Geofencing API (что ужасно, мне нужно реагирующий геозон Dammit и не заботится о потреблении электроэнергии). Это также не упоминается нигде в документации. Кроме того, без GPS вы не можете надеяться на меньшие геозоны из-за отсутствия точности с Wi-Fi/ячейкой.

Вы должны опрашивать GPS отдельно с помощью нулевого обработчика, чтобы нужные места, предоставленные этому нулевому обработчику, также предоставлялись API геопокрытия, надежно запуская ваши геообъекты.

4

У меня также были проблемы. Убедитесь, что ваш путь определен правильно, добавив службу в ваш AndroidManifest. Мне также пришлось изменить экспортируемую ценность на true.

<application> 
... 
    <service 
     android:name=".ReceiveTransitionsIntentService" 
     android:exported="true" > 
    </service> 
... 
</application> 

Вы также должны добавить тег метаданных в свой манифест, чтобы указать версию своего gogle-версии.

<application> 
... 
    <meta-data 
     android:name="com.google.android.gms.version" 
     android:value="4242000" /> 
... 
</application> 

Я создал гораздо более простую версию, например Google, с кодом и более подробным объяснением, here. Надеюсь, это поможет!

3

К сожалению, это похоже на ожидаемое поведение. Geofence API настроен для прослушивания автоматических обновлений местоположения на устройстве. Обычно это работает, когда вы останавливаетесь на месте, но, как вы сказали, если вы проезжаете через забор или у вас есть радиус всего в несколько метров, вы, вероятно, пропустите его. Говорят, что API автоматически проверяет ваше поведение (ходьба, вождение и т. Д.) И чаще обновляется, если это так, но это, похоже, не так.

Вы заметите, что если у вас открыты Карты Google и отслеживания местоположения, забор будет запущен правильно.

Таким образом, вы можете предположить, что единственным реальным решением является настройка вашего собственного сервиса, который проверяет местоположение через определенные промежутки времени (Google рекомендует 20 секунд https://www.youtube.com/watch?v=Bte_GHuxUGc), который затем будет принудительно транслировать местоположение через эти интервалы. Geofences автоматически запускаются, если они находятся в этом местоположении.