Не удалось получить точное местоположение на устройстве Android - PullRequest
1 голос
/ 22 мая 2019

Мы разработали приложение для доставки, как ola и uber.Где райдер может принять заказ и доставить заказчику.Мы создали службу Android (Background Service), в которой мы инициализировали наши переменные местоположения.Мы получаем данные о местоположении тремя способами: провайдером сети, провайдером GPS, API местоположения Google FusedВсе три мы использовали для получения местоположения, когда мы получаем местоположение, которое оно хранит в нашей переменной-члене (позже оно используется в стороннем проекте), и это же местоположение сохраняется на нашем сервере для этого гонщика.Мы сталкиваемся с 2 или 3 проблемами конкретно.1. Некоторое время местоположение пользователя является правильным, и в течение 20-30 секунд мы получили неправильное местоположение с точностью, скажем,> 50 или 100. 2. Некоторое время местоположение застряло на несколько минут или на длительный час.

МыИспользуете специально разработанную Google стратегию определения местоположения.ниже образец.

private static final int TWO_MINUTES = 1000 * 60 * 2;

/** Determines whether one Location reading is better than the current Location fix
 * @param location  The new Location that you want to evaluate
 * @param currentBestLocation  The current Location fix, to which you want to compare the new one
 */
protected boolean isBetterLocation(Location location, Location currentBestLocation) {
    if (currentBestLocation == null) {
        // A new location is always better than no location
        return true;
    }

    // Check whether the new location fix is newer or older
    long timeDelta = location.getTime() - currentBestLocation.getTime();
    boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
    boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
    boolean isNewer = timeDelta > 0;

    // If it's been more than two minutes since the current location, use the new location
    // because the user has likely moved
    if (isSignificantlyNewer) {
        return true;
        // If the new location is more than two minutes older, it must be worse
    } else if (isSignificantlyOlder) {
        return false;
    }

    // Check whether the new location fix is more or less accurate
    int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
    boolean isLessAccurate = accuracyDelta > 0;
    boolean isMoreAccurate = accuracyDelta < 0;
    boolean isSignificantlyLessAccurate = accuracyDelta > 200;

    // Check if the old and new location are from the same provider
    boolean isFromSameProvider = isSameProvider(location.getProvider(),
            currentBestLocation.getProvider());

    // Determine location quality using a combination of timeliness and accuracy
    if (isMoreAccurate) {
        return true;
    } else if (isNewer && !isLessAccurate) {
        return true;
    } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
        return true;
    }
    return false;
}

/** Checks whether two providers are the same */
private boolean isSameProvider(String provider1, String provider2) {
    if (provider1 == null) {
        return provider2 == null;
    }
    return provider1.equals(provider2);
}


if (isMoreAccurate)
{
    return true;
}
else if (isNewer && !isLessAccurate) 
{
    return true;
}
else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) 
{
    return true;
}

return false;

Я понятия не имею, что делать дальше.

Я интегрировал Network Provide, провайдера GPS и провайдера слияния.Я получаю местоположение, но менее точно.я также вел список последних 10 последовательных местоположений.Когда я получил 11-е местоположение, я выполнил поиск в списке, и, если обнаружил, что все местоположение одинаково (это означает, что местоположение застряло), тогда я очистил свой список и отбросил соединение местоположения, остановив и перезапустив службу снова с новыми подключениями.

1 Ответ

2 голосов
/ 22 мая 2019

Android имеет ограничения для получения обновлений местоположения из фоновых служб. Вам нужно либо получить местоположение из основной деятельности, либо изменить службу на службу Foreground с прикрепленным уведомлением, чтобы получать периодические обновления местоположения.

Проблемы с точностью определения местоположения также могут быть связаны с тем, что пользователь не настраивает режим высокой точности определения местоположения в устройстве. Это проверит, включено ли местоположение в пользовательском устройстве. Диалог будет отображаться, если местоположение включено, но высокая точность не включена.

private static final int REQUEST_CHECK_SETTINGS = 001;

private void displayLocationSettingsRequest(Context context) {
        GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context)
                .addApi(LocationServices.API).build();
        googleApiClient.connect();

        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(10000);
        locationRequest.setFastestInterval(10000 / 2);

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
        builder.setAlwaysShow(true);

        PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(LocationSettingsResult result) {
                final Status status = result.getStatus();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        //Location settings satisfied
                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        //Location settings are not satisfied. Show the user a dialog to upgrade location settings
                        try {
                            status.startResolutionForResult(Activity.this, REQUEST_CHECK_SETTINGS);
                        } catch (IntentSender.SendIntentException e) {
                            LogUtil.i("PendingIntent unable to execute request.");
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        //Location settings are inadequate, and cannot be fixed here. Dialog not created.
                        Toast.makeText(Activity.this, "Error enabling location. Please try again", Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        });
    }
...