Намерение выхода Android Geofence не содержит данных

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

  • Я сам добавляю категорию, и эта категория успешно извлекается.
  • Я также добавил сериализуемое дополнение, которое отлично извлекается из намерения.

Приведенные выше два аргумента доказывают, что намерение, которое я получаю, на самом деле является тем, которое я запланировал для перехода через геозону.

Что не работает.

GeofenceEvent, похоже, возвращает значения по умолчанию для всех методов. . Так что я получаю;

  • ложь для hasError()
  • и -1 для getErrorCode()
  • getGeofenceTransition() возвращает -1
  • список, возвращаемый функцией getTriggeredGeofences(), пуст.

Кажется, это противоречит документации API... getGeofenceTransition();

-1, если намерение, указанное в fromIntent(Intent), не генерируется для предупреждения о переходе; В противном случае возвращает значение флага GEOFENCE_TRANSITION_, определенное в Geofence.

с помощью getErrorCode();

код ошибки, указанный в GeofenceStatusCodes, или -1, если hasError() возвращает false.

и имеетОшибка();

true, если ошибка вызвала намерение, указанное в fromIntent(Intent), в противном случае false

Как добавить геозону

// create fence
Geofence fence = new Geofence.Builder()
        .setRequestId(an_id)
        .setCircularRegion(lat, long, radius)
        .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_EXIT)
        .setExpirationDuration(240 * 60 * 1000)
        .build();

// create pendingintent
Intent launch = new Intent(this, same_class.class);
launch.putExtra(extra_object_key, extra_object);
launch.addCategory(category_name);

PendingIntent intent = PendingIntent.getService(
        getApplicationContext(),
        0, launch,
        PendingIntent.FLAG_UPDATE_CURRENT
);

// create add fence request
GeofencingRequest request = new GeofencingRequest.Builder()
        .addGeofence(fence)
        .build();

// add fence request
PendingResult<Status> result = LocationServices.GeofencingApi.addGeofences(googleApiClient,
        request, intent);

// we'll do this synchronous
Status status = result.await();
if (status.getStatusCode() != GeofenceStatusCodes.SUCCESS)
{
    Log.e(SERVICE_NAME, "Failed to add a geofence; " + status.getStatusMessage());
    return false;
}

Как я получаю намерение

protected void onHandleIntent(Intent intent)
{
    if (intent.hasCategory(category_name))
    {
        GeofencingEvent event = GeofencingEvent.fromIntent(intent);
        if (event.hasError())
        {
            Log.e(SERVICE_NAME, "Failed geofence intent, code: " + event.getErrorCode());
        }
        else
        {
            // checked 'event' here with debugger and prints for the stuff I wrote above

            switch (event.getGeofenceTransition())
            {
                case Geofence.GEOFENCE_TRANSITION_EXIT:
                    // NEVER REACHED
                    type extra_object =   (type)intent.getSerializableExtra(extra_object_key);
                    onGeofenceExit(extra_object);
                    break;
                default:
                    // ALWAYS END UP HERE
                    throw new AssertionError("Geofence events we didn't register for.");
            }
        }
    }
    else
    {
        throw new AssertionError("Received unexpected intent.");
    }
}

Подключение к игровым сервисам

public void onCreate()
{
    super.onCreate();

    googleApiAvailable = false;
    GoogleApiClient.Builder  gApiBuilder = new GoogleApiClient.Builder(getApplicationContext());
    gApiBuilder.addApi(LocationServices.API);

    gApiBuilder.addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks()
    {
        @Override
        public void onConnected(Bundle bundle)
        {
            googleApiAvailable = true;
        }

        @Override
        public void onConnectionSuspended(int i)
        {
            googleApiAvailable = false;
        }
    });

    gApiBuilder.addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener()
    {
        @Override
        public void onConnectionFailed(ConnectionResult connectionResult)
        {
            googleApiAvailable = false;
        }
    });

    googleApiClient = gApiBuilder.build();
}

person dzan    schedule 11.12.2014    source источник
comment
Нет, я никогда этого не делал. Если у вас есть новости, мне все еще интересно!   -  person dzan    schedule 13.04.2015
comment
У меня та же проблема, когда я передаю Serializable Object через дополнительные функции, getGeofenceTransition возвращает -1, но когда я передаю некоторую примитивную переменную, она работает. . .   -  person Jilberta    schedule 13.04.2015


Ответы (1)


Где вы подключаетесь к googleApiClient? Там должен быть

googleApiClient.connect();

и дождитесь onConnected или

googleApiClient.blockingConnect();

в вашем коде, но я его не вижу. Выложите весь код.

person Marian Paździoch    schedule 12.12.2014
comment
Я добавил код, который использую для настройки игровых сервисов. Прежде чем приступить к геозонированию, я использую метод blockingConnect() и проверяю логическое значение. - person dzan; 15.12.2014
comment
это там, мой класс намного больше, чем размещенный здесь, и я не хочу просто копировать и вставлять сюда огромный кусок не относящихся к делу деталей. Все это является сервисом намерений, а onHandleIntent имеет «дескрипторы» для разных категорий. Категория, которая добавляет заборы, также имеет подключение. Как видите, я также проверяю ошибки после добавления забора. Это не приводит к ошибкам. - person dzan; 16.12.2014