Получение 0.0 для широты и долготы при отображении текущего местоположения на карте

#android #google-maps #map #geolocation #userlocation

#Android #google-карты #словарь #геолокация #местоположение пользователя

Вопрос:

Я использую следующий код, чтобы получить свое текущее местоположение. Но проблема, с которой я сталкиваюсь, заключается в том, что он всегда возвращает 0.0 для широты и долготы. Я включил настройки GPS в телефоне и установил все разрешения. Но все же я сталкиваюсь с этим.

 locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

customLocationListener = new CustomLocationListener();

locationManager.requestLocationUpdates(

        LocationManager.GPS_PROVIDER,

        0,

        0,

        customLocationListener);

class CustomLocationListener implements LocationListener{ ............

      public void onLocationChanged(Location argLocation) { 

         if(location != null) {     

        int latitude=(int)(argLocation.getLatitude()*1E6);   

        int longitude=(int)(argLocation.getLongitude()*1E6);


              }
       } ........ }
  

Кто-нибудь из вас знает, почему?

Примечание: моя активность расширяет MapActivity, а не Location Listener

Комментарии:

1. для эмулятора .. вы отправили географические точки из элемента управления эмулятором?

2. Вы уверены, что у вас есть исправление GPS? Карта может использовать PASSIVE_PROVIDER провайдера для отображения текущего местоположения (т. Е. Может даже не использовать GPS).

3. широта и долгота должны быть двойными, а не целыми числами, каким должен быть 1E6?

4. вы проверяете его на телефоне или на телефоне … если он включен в эмулятор, вам нужно отправить lat-lon вручную из ddms, как сказал @MayurParekh.

5. @hanry.. Я проверяю только телефон, а не в эмуляторе.

Ответ №1:

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


Редактировать 1

  1. Откройте приложение Google Maps и нажмите кнопку на карте, чтобы получить текущее местоположение.

  2. Когда вы разрешаете разрешение Google map, будут работать только разрешения других приложений. (и я чувствую, что это большая ошибка)

  3. Теперь перейдите в свое приложение и попытайтесь получить текущее местоположение, и оно будет работать.

Это некрасиво, но мы должны выполнить эти шаги, чтобы получить текущее местоположение в нашем приложении.

Ответ №2:

попробуйте этот способ

 locationManager = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);


        Criteria locationCritera = new Criteria();
        String providerName = locationManager.getBestProvider(locationCritera,
                true);
        if(providerName!=null)
            location = locationManager.getLastKnownLocation(providerName);

        locationListener = new MyLocationListener();

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                0, locationListener);
  

в mylocationlistener задайте свой объект местоположения

 private class MyLocationListener implements LocationListener {

    public void onLocationChanged(Location loc) {

        if (loc != null) {
            location = loc; 

        }
    }

    public void onProviderDisabled(String provider) {

    }

    public void onProviderEnabled(String provider) {
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
}
  

Комментарии:

1. @ Mayur Parekh…am получение null для местоположения, если я делаю location = LocationManager.getLastKnownLocation(ProviderName); Я получил значение для поставщика как gps.

2. Я понял, в чем проблема, это было потому, что место, где я сижу, не получало надлежащего GPS-соединения ..!! Я попробовал в эмуляторе путем жесткого кодирования широты и долготы, тогда это работает. Вывод: лучше попробовать в эмуляторе для теста, чтобы получить текущее местоположение пользователя

3. Можете ли вы сказать мне, как получить адрес местоположения пользователя, т.Е. Не Координаты, а полный адрес, где он в настоящее время находится

4. вы должны опубликовать это как новый вопрос. в любом случае вы можете использовать класс геокодера Geocoder geocoder = новый геокодер (this, Locale.getDefault()); Список <Адрес> адреса = geocoder.getFromLocation(широта, спг, 1);

5. Привет, код в принятом ответе работает нормально. Вы можете следовать этому. Убедитесь, что вы находитесь за пределами здания, иногда, если вы проверяете внутри здания, это может не сработать!!

Ответ №3:

Вот что вы хотите ..!

 public void getCurrentLocation() {
        LocationManager locationManager;
        String context = Context.LOCATION_SERVICE;
        locationManager = (LocationManager) getSystemService(context);
        Criteria crta = new Criteria();
        crta.setAccuracy(Criteria.ACCURACY_FINE);
        crta.setAltitudeRequired(false);
        crta.setBearingRequired(false);
        crta.setCostAllowed(true);
        crta.setPowerRequirement(Criteria.POWER_LOW);
        String provider = locationManager.getBestProvider(crta, true);

        locationManager.requestLocationUpdates(provider, 1000, 0,
                new LocationListener() {
                    @Override
                    public void onStatusChanged(String provider, int status,
                            Bundle extras) {
                    }

                    @Override
                    public void onProviderEnabled(String provider) {
                    }

                    @Override
                    public void onProviderDisabled(String provider) {
                    }

                    @Override
                    public void onLocationChanged(Location location) {
                        if (location != null) {
                            double lat = location.getLatitude();
                            double lng = location.getLongitude();
                            if (lat != 0.0 amp;amp; lng != 0.0) {
                                System.out.println("WE GOT THE LOCATION");
                                System.out.println(lat);
                                System.out.println(lng);                                                         
                            }
                        }

                    }

                });
    }
  

Комментарии:

1. @Noby… Я пытался, но получаю 0.0 в строке double lat = location.getLatitude(); Так что моя проблема продолжалась.

2. выключите gps, затем попробуйте …! Убедитесь, что у вас достаточно времени, чтобы получить информацию о вашем местоположении. (подождите пять минут).

Ответ №4:

CustomLocationManager.Java

 import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

public class CustomLocationManager {

    private LocationManager mLocationManager;
    private LocationValue locationValue;
    private Location networkLocation = null;
    private Location gpsLocation = null;

    private Timer mTimer;

    private boolean isGpsEnabled = false;
    private boolean isNetworkEnabled = false;

    private static CustomLocationManager _instance;

    private CustomLocationManager() {}

    public static CustomLocationManager getCustomLocationManager() {
        if (_instance == null) {
            _instance = new CustomLocationManager();
        }
        return _instance;
    }

    public LocationManager getLocationManager(Context context) {
        if (mLocationManager == null)
            mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        return mLocationManager;
    }

    public boolean getCurrentLocation(Context context, LocationValue result) {
        locationValue = resu<
        if (mLocationManager == null)
            mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        try {
            isGpsEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {}

        try {
            isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception ex) {}

        if (!isGpsEnabled amp;amp; !isNetworkEnabled)
            return false;

        if (isGpsEnabled)
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, gpsLocationListener);

        if (isNetworkEnabled)
            mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, networkLocationListener);

        mTimer = new Timer();
        mTimer.schedule(new GetLastKnownLocation(), 20000);

        return true;
    }

    LocationListener gpsLocationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            mTimer.cancel();
            locationValue.getCurrentLocation(location);
            mLocationManager.removeUpdates(this);
            mLocationManager.removeUpdates(networkLocationListener);
        }

        public void onProviderDisabled(String provider) {}

        public void onProviderEnabled(String provider) {}

        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    private LocationListener networkLocationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            mTimer.cancel();
            locationValue.getCurrentLocation(location);
            mLocationManager.removeUpdates(this);
            mLocationManager.removeUpdates(gpsLocationListener);
        }

        public void onProviderDisabled(String provider) {}

        public void onProviderEnabled(String provider) {}

        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    private class GetLastKnownLocation extends TimerTask {
        CurrentLocationHandler handler;

        GetLastKnownLocation() {
            handler = new CurrentLocationHandler();
        }

        @Override
        public void run() {
            mLocationManager.removeUpdates(gpsLocationListener);
            mLocationManager.removeUpdates(networkLocationListener);

            if (isGpsEnabled)
                gpsLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

            if (isNetworkEnabled)
                networkLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

            handler.sendEmptyMessage(0);
        }
    }

    private class CurrentLocationHandler extends Handler {
        @Override
        public final void handleMessage(Message msg) {
            if (gpsLocation != null amp;amp; networkLocation != null) {

                if (gpsLocation.getTime() > networkLocation.getTime())
                    locationValue.getCurrentLocation(gpsLocation);
                else
                    locationValue.getCurrentLocation(networkLocation);

                return;
            }

            if (gpsLocation != null) {
                locationValue.getCurrentLocation(gpsLocation);
                return;
            }

            if (networkLocation != null) {
                locationValue.getCurrentLocation(networkLocation);
                return;
            }

            locationValue.getCurrentLocation(null);
        }
    }
}
  

LocationValue.Java

 import android.location.Location;

public abstract class LocationValue {
    public abstract void getCurrentLocation(Location location);
}
  

YourActivity.Java

 private void getCurrentLocation() {
        CustomLocationManager.getCustomLocationManager().getCurrentLocation(this, locationValue);
    }

    public LocationValue locationValue = new LocationValue() {
        @Override
        public void getCurrentLocation(Location location) {
            // You will get location here if the GPS is enabled
            if(location != null) {
                Log.d("LOCATION", location.getLatitude()   ", "   location.getLongitude());
            }
        }
    };
  

Комментарии:

1. Здесь, когда мы даем разрешение на определение местоположения, а затем, подождав несколько секунд, GPS потребуется время для определения стабильного местоположения, после чего мы получим фактические значения широты и длины.

2. Работает идеально… Хорошее решение

Ответ №5:

Здесь, когда мы даем разрешение на определение местоположения, а затем, подождав несколько секунд, GPS потребуется время для определения стабильного местоположения, после чего мы получим фактические значения широты и длины.

Настройка -> Включить GPS

Причина, по которой значение lat long равно 0.0