Nano Hash - криптовалюты, майнинг, программирование

setMyLocationEnabled API GoogleMaps v2 отличается от LocationManager

У меня, вероятно, простой вопрос, но я не могу понять, что не так.

Когда я устанавливаю свое местоположение с помощью кнопки на карте, местоположение почти 100 точно.

Когда я использую Диспетчер местоположения, чтобы получить свое местоположение, я получаю около 10-20 метров неправильного местоположения.

Вот код:

@Override
public void onMapReady(final GoogleMap googleMap) {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    mGoogleMap = googleMap;
    mGoogleMap.setMyLocationEnabled(true);


    Button setLoc = (Button) findViewById(R.id.setLoc);

    assert setLoc != null;
    setLoc.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            mGoogleMap.clear();
            LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            Criteria criteria = new Criteria();
            Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));

            latLng = new LatLng(location.getLatitude(), location.getLongitude());

            Toast.makeText(MainActivity.this, String.valueOf(latLng), Toast.LENGTH_LONG).show();
            //zoom to current position:
            mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
            mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(17));
            mGoogleMap.addMarker(new MarkerOptions().position(latLng).title("Your location").anchor(0.0f, 1.0f));

        }
    });

}

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

небольшое ОБНОВЛЕНИЕ, когда я запускаю код на эмуляторе, он находится почти в том же месте... хм, на реальном устройстве все по-другому. В чем может быть проблема?


Ответы:


1

Я думаю, что это может зависеть от устройства. Вам нужно изменить приоритет на PRIORITY_HIGH_ACCURACY. Прежде чем запрашивать обновления местоположения, ваше приложение должно подключиться к службам определения местоположения и сделать запрос местоположения. После того, как запрос местоположения будет готов, вы можете начать регулярные обновления, вызвав requestLocationUpdates() сделайте это в onConnected() обратный вызов, предоставляемый клиентом Google API, который вызывается, когда клиент готов.

Обновите местоположение с помощью обратного вызова LocationListener. Вызовите requestLocationUpdates(), передав ему свой экземпляр GoogleApiClient, объект LocationRequest и LocationListener. Определите метод startLocationUpdates(), вызываемый из обратного вызова onConnected().

@Override
public void onConnected(Bundle connectionHint) {
...
if (mRequestingLocationUpdates) {
startLocationUpdates();
}
}

protected void startLocationUpdates() {
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
}
15.04.2016
  • Это сработало, мне просто пришлось использовать Fused location provider, такой же, как у синей точки. Теперь мое местоположение всегда одинаково. Ответ принят. 18.04.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..