Добавление Geofence дает статус ApiException 13 - PullRequest
6 голосов
/ 19 июня 2019

Недавно возникла проблема, при которой добавление геозон будет случайным образом завершаться ошибкой ApiException, код состояния 13, который определен как «ОШИБКА», дополнительные подробности не предоставлены.

Обычно коды ошибок относятся только к геозонам, но это общий сбой. Кто-нибудь понял, почему GeofencingClient возвращает код состояния 13? Я не смог найти никого с такой же проблемой.

Похоже, что это влияет на более старые сборки приложения, в котором оно ранее работало без проблем.

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

Я также пытался измениться с GeofencingClient(context) до LocationServices.getGeofencingClient(context) без изменений.

Я пытался обновить версии библиотеки, без разницы.

Типичная настройка манифеста с определенной версией сервисов воспроизведения и ключом API;

<meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version"/>

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="@string/maps_api_key"/>

<service android:name=".GeofenceTransitionsIntentService"/>

Здесь добавлены геозоны, и к сервису намерений результаты не доходят

private val geofencingClient = GeofencingClient(context)

private val geofencePendingIntent =
            PendingIntent.getService(context, 0, Intent(context, GeofenceTransitionsIntentService::class.java), PendingIntent.FLAG_UPDATE_CURRENT)

fun setGeofence(latitude: Double, longitude: Double, radius: Float, geofenceId: String) {
        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            val geofenceList = listOf(buildGeofence(latitude, longitude, radius, geofenceId))
            geofencingClient.addGeofences(getGeofencingRequest(geofenceList), geofencePendingIntent)?.run {
                addOnFailureListener {
                    // Failed to add geofences
                    geofenceErrorListener?.invoke("Failed to add Geofence: ${it.message}")
                }
            }
        }
    }

Это не было проблемой до недавнего времени, и теперь это происходит почти в 100% случаев.

com.google.android.gms.common.api.ApiException: 13:

Редактировать: Начиная с версии PlayServices 17.7.85 (на моем устройстве), проблема, похоже, решена в конце Google

Ответы [ 3 ]

1 голос
/ 06 июля 2019

Ошибка addGeofences StatusException: 13 стала происходить довольно часто для меня и пользователей моего приложения, несмотря на то, что я не вносил никаких изменений в приложение. Наблюдается на различных устройствах под управлением Android 9. Пользователи начали сообщать о проблеме примерно в середине июня.

Прочитав об этом здесь - благодаря @Ldawg и @StephenRuda - и добавив свои комментарии к проблеме Google, я решил внести некоторые умозрительные изменения в приложение при добавлении геозон. Провел несколько тестов и после того, как проблема не была воспроизведена, выпустила Beta then Production в магазин Play. Проблема еще не наблюдалась с новой версией.

Я публикую свое модифицированное решение на случай, если оно кому-нибудь поможет, однако концептуально оно похоже на то, что Ldawg опубликовало изначально с ошибкой. Кроме того, я еще не смог провести регрессионное тестирование предыдущей версии, чтобы увидеть, происходит ли это по-прежнему. Так как это непрозрачная ошибка без описания, не исключено, что существует несколько триггеров, вызванных различными состояниями в gms. Пока Google сами не подтвердят это, исправление носит спекулятивный характер, и проблема несколько неуловима.

Основное изменение в моем исправлении состоит в том, что раньше, rxLocationProvider.addGeofences и rxLocationProvider.removeGeofences вызывались в цикле несколько раз для каждого местоположения, и наблюдалась ошибка status 13.

После изменения rxLocationProvider.addGeofences вызывается только один раз со списком Geofence объектов. rxLocationProvider.removeGeofences также принимает список местоположений, а не один. Приложение использует библиотеку mcharmas android реактивного местоположения https://github.com/mcharmas/Android-ReactiveLocation

Код до с StatusException: 13

private GeofencingRequest createGeofencingRequest(String requestId) {
        Geofence geofence = new Geofence.Builder()
                .setRequestId(requestId)
                .setCircularRegion(stationInfo.getLat(), stationInfo.getLon(), GEOFENCE_RADIUS_METRES)
                .setExpirationDuration(Geofence.NEVER_EXPIRE)
                .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT)
                .build();
        return new GeofencingRequest.Builder().addGeofence(geofence).build();
    }

public void addGeofence(String locationCrs) {
        final GeofencingRequest geofencingRequest = createGeofencingRequest(locationCrs);
        final PendingIntent pendingIntent = createNotificationBroadcastPendingIntent();

        ArrayList<String> lists = new ArrayList<>();
        lists.add(locationCrs);
        rxLocationProvider
                .removeGeofences(lists)
                .flatMap((Function<Status, Observable<Status>>)
                        status -> rxLocationProvider.addGeofences(pendingIntent, geofencingRequest))
                .subscribe(addGeofenceResult -> {

                }, throwable -> {
                    // **Status 13 here**
                }));
    }

Код после - ошибок не обнаружено

private GeofencingRequest getGeofencingRequest() {
        GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
        builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
        builder.addGeofences(geofenceList);
        return builder.build();
    }

private Geofence createGeofence(String requestId) {
        return new Geofence.Builder()
                .setRequestId(requestId)
                .setCircularRegion(stationInfo.getLat(), stationInfo.getLon(), GEOFENCE_RADIUS_METRES)
                .setExpirationDuration(Geofence.NEVER_EXPIRE)
                .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT)
                .build();
    }

public void addGeofences(List<String> locs) {
        for (String loc : locs) {
            Geofence request = createGeofence(loc);
            geofenceList.add(request);
        }

        final PendingIntent pendingIntent = createNotificationBroadcastPendingIntent();

        disposable.add(rxLocationProvider
                .removeGeofences(locs)
                .flatMap((Function<Status, Observable<Status>>)
                        status -> rxLocationProvider.addGeofences(pendingIntent, getGeofencingRequest()))
                .subscribe(addGeofenceResult -> {

                }, throwable -> {
                    // **No Errors observed**
                }));
    }
1 голос
/ 08 июля 2019

Google вернулся к нам, чтобы сообщить нам, что они исправили эту проблему.Я смог подтвердить, что мое нерабочее устройство теперь работает.

0 голосов
/ 22 июня 2019

Я проводил некоторые тесты с бета-версией Android Q и заметил, что всегда буду получать эту ошибку, если у моего приложения будет новое разрешение на размещение «Разрешить только при использовании приложения». Даже когда приложение находилось на переднем плане, мне никогда не удавалось добавить какие-либо геозоны с разрешением местоположения, установленным на «Разрешить только при использовании приложения», но как только я установил разрешение местоположения своего приложения на «Разрешить все время», я могу добавить геозоны без проблем.

Однако я все еще вижу проблему в других версиях API, поэтому, к сожалению, она не решает проблему полностью. У меня есть устройство под управлением Android 8.0 и одно под управлением Android 9.0, и я все еще время от времени вижу ошибку состояния # 13. Я не уверен, что делать на этих устройствах, потому что у них нет нового разрешения «Разрешить только при использовании приложения». Они оба имеют полный доступ к местоположению.

Я добавляю этот ответ, поскольку он может помочь некоторым пользователям, использующим бета-версию Android Q, или хотя бы пролить свет на то, что может вызывать проблему. Я думаю, что это как-то связано с последней версией Сервисов Google Play, потому что я думаю, что мы все делаем все правильно.

EDIT: Я добавил проблему в систему отслеживания проблем Google, если кто-то заинтересован в следующем ... https://issuetracker.google.com/issues/135771329

...