Я использую относительно новую версию 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();
}