Приложение получает неправильное местоположение до открытия встроенного приложения Google Map

Я разработал одно приложение, которое используется для поиска текущего местоположения устройства. Я использовал Fuse Location API для получения текущего местоположения.

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

Вот мой запрос на размещение.

mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FATEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(DISPLACEMENT); // 10 meters

Может ли кто-нибудь сказать мне, что случилось? Ваша помощь действительно оценена.

Ответ 1

Итак, Waze, и мы использовали FusedLocation в прошлом и столкнулись с множеством проблем. API нарушен. Есть некоторые устройства, которые не работают должным образом. Распознавание активности, в результате чего много реле не работает и правильно распознает персонал. По окончании мы вернемся к API-интерфейсу менеджера местоположений.

Здесь фрагмент:

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

if (mLocationManager == null) {
        LOGGER.info("Location track,start called first time. Creating Location Manager");
        mLocationManager = (LocationManager) mContextWeakReference.get()
                .getSystemService(Context.LOCATION_SERVICE);

        mLocationHandlerThread
                = new HandlerThread("LocationThread", Thread.NORM_PRIORITY);
        mLocationHandlerThread.start();
        // Now get the Looper from the HandlerThread
        // NOTE: This call will block until the HandlerThread gets control and initializes its Looper
        Looper looper = mLocationHandlerThread.getLooper();
        Location networkLastKnownLocation = null;
        Location gpsLastKnownLocation = null;
        mGpsLocationListener = new GpsLocationListener();
        mNetworkLocationListener = new NetworkLocationListener();

        // Register the listener with the Location Manager to receive location updates
        if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER)) {
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS,
                    mGpsLocationListener,
                    looper);

            gpsLastKnownLocation = mLocationManager
                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        } else {
            setGpsProviderAvailable(false);
        }
        if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)) {
            networkLastKnownLocation = mLocationManager
                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                    LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS,
                    mNetworkLocationListener,
                    looper);
        }

        setLastKnownLocationDifferentProviders(gpsLastKnownLocation,
                networkLastKnownLocation);

    }

И слушатели:

public class GpsLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location location) {
        LOGGER.info("Location track ,onLocationChanged location={}", location);
        switch (location.getProvider()) {
            case LocationManager.GPS_PROVIDER:
                if (mLocationManager != null) {
                    mLocationManager.removeUpdates(mNetworkLocationListener);
                }
                break;
        }
        setLastKnownLocation(location);
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        LOGGER.info("onStatusChanged: {}, status: {}", provider, status);
    }

    @Override
    public void onProviderEnabled(String provider) {
        LOGGER.info("onProviderEnabled: " + provider);
        if (provider.equals(LocationManager.GPS_PROVIDER)) {
            setGpsProviderAvailable(true);
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        LOGGER.info("onProviderDisabled: " + provider);
        if (provider.equals(LocationManager.GPS_PROVIDER)) {
            setGpsProviderAvailable(false);
        }
    }
}

public class NetworkLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location location) {
        LOGGER.info("Location track ,onLocationChanged location={}", location);
        switch (location.getProvider()) {
            case LocationManager.NETWORK_PROVIDER:
                setLastKnownLocation(location);
                break;
        }
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        LOGGER.info("onStatusChanged: {}, status: {}", provider, status);
    }

    @Override
    public void onProviderEnabled(String provider) {
        LOGGER.info("onProviderEnabled: " + provider);
        if (provider.equals(LocationManager.GPS_PROVIDER)) {
            setGpsProviderAvailable(true);
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        LOGGER.info("onProviderDisabled: " + provider);
        if (provider.equals(LocationManager.GPS_PROVIDER)) {
            setGpsProviderAvailable(false);
        }
    }
}

Не забывайте отменить регистрацию и остановить все потоки:)

Ответ 2

Я не уверен в этом, но в последнее время я видел что-то вроде этого, что у телефона не было выделенного GPS. У него был только GPS-приемник.

После долгого разговора я понял, что именно по этой причине я не получал точное местоположение. Но после открытия карт по какой-то причине местоположение было точным. Google определенно делает много других вещей на картах, чтобы получать точное местоположение на картах, даже если на телефоне нет выделенного GPS. Просто проверьте устройства и их спецификации оборудования.

Ответ 3

При создании LocationRequest у вас должен быть setPriority() до PRIORITY_NO_POWER.

PRIORITY_NO_POWER означает, что ваше приложение никогда не получит какое-либо местоположение, если другое приложение в телефоне не запросило места и не получил его. Подробнее на LocationRequest.

Ответ 4

Вы, ребята, тестируете устройство Marshmallow или выше?
В устройствах выше Lollipop, вы должны запросить разрешение на размещение во время выполнения. Ссылка на эту ссылку http://developer.android.com/training/permissions/requesting.html
Таким образом, у вас не будет разрешения на размещение, поэтому оно не вернет точное местоположение, но когда вы начнете Приложение карты, которое уже имеет разрешение Gps, обновит ваше местоположение в сервисе Google Play. Таким образом, вы также начинаете показывать правильное местоположение, потому что местоположение в конечном итоге извлекается из службы Google Play.