Получение текущего местоположения GPS на Android - PullRequest
4 голосов
/ 05 февраля 2011

Я пытаюсь получить текущее местоположение пользователя с помощью GPS,

Написал простой класс, который реализует LocationListener

public class LocationManagerHelper implements LocationListener {

    private static double latitude;
    private static double longitude;

    @Override
    public void onLocationChanged(Location loc) {
        latitude = loc.getLatitude();
        longitude = loc.getLongitude();
    }

    @Override
    public void onProviderDisabled(String provider) { }

    @Override
    public void onProviderEnabled(String provider) { }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    public static double getLatitude() {
        return latitude;
    }

    public static double getLongitude() {
        return longitude;
    }

}

и из простого действия я получаю доступ к этим значениям долготы и широты

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /** create a TextView and write Hello World! */
    TextView tv = new TextView(this);

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

    LocationListener mlocListener = new LocationManagerHelper();

    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
            mlocListener);

    if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            tv.append("Latitude:- " + LocationManagerHelper.getLatitude()
                    + '\n');
            tv.append("Longitude:- " + LocationManagerHelper.getLongitude()
                    + '\n');
    } else {
        tv.setText("GPS is not turned on...");
    }

    /** set the content view to the TextView */
    setContentView(tv);

Но он всегда возвращает 0.0 в качестве результата. Не могу понять проблему.

Ответы [ 5 ]

19 голосов
/ 05 февраля 2011

Обновления местоположения фактически асинхронные . Это означает, что API не заставляет ваш вызывающий поток ждать, пока не станет доступно новое местоположение; вместо этого вы регистрируете объект-наблюдатель с помощью специального метода ( callback ), который вызывается всякий раз, когда вычисляется новое местоположение.

В API LocationManager для Android наблюдателем является LocationListener объект, а основным обратным вызовом для обновлений местоположения является onLocationChanged ()

Вот диаграмма, пытающаяся объяснить этот момент (надеюсь, это поможет, а не смущает вас!)

Sequence diagram

Итак, из вашего текущего кода:

  • Объявите mlocListener членом вашего подкласса Activity
  • Добавить выходные данные журнала (строки Logcat) в вашу реализацию LocationListener
  • Оставьте остальную часть кода как есть.
  • Добавьте необходимые разрешения в манифесте ( FINE_LOCATION необходимо для GPS), если это еще не сделано.
  • Попробуйте подключить телефон к Интернету и возле окна, чтобы получить достаточно быстрое исправление GPS (должно быть ~ 30 с).

Затем запустите приложение и посмотрите, что происходит в logcat. вы увидите, что изменения статуса и обновления местоположения происходят не сразу после первоначального запроса, что объясняет, почему ваше текстовое представление всегда показывает (0.0,0.0).

Подробнее: http://developer.android.com/guide/topics/location/obtaining-user-location.html

3 голосов
/ 05 февраля 2011

Ваши обратные вызовы обновления местоположения не могут быть запущены до тех пор, пока не вернется onCreate (). Если вы инициализируете переменные lat / long для фиктивных значений, вы, вероятно, увидите, что вы печатаете эти значения.

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

Также убедитесь, что ваше приложение имеет соответствующие разрешения в манифесте.

2 голосов
/ 05 февраля 2011

После того, как вы получите mLocListener - установите критерии, как показано ниже

String mlocProvider;<br> Criteria hdCrit = new Criteria();<br> hdCrit.setAccuracy(Criteria.ACCURACY_COARSE);<br> mlocProvider = mlocManager.getBestProvider(hdCrit, true);

и затем используйте getLastKnownLocation

tv.append("\n\nLocations (starting with last known):");<br> Location currentLocation = mlocManager.getLastKnownLocation(mlocProvider);

Убедитесь, что они есть в вашем манифесте
uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"<br> uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"<br>

Если вы используете эмулятор - в перспективе DDMS ищите элементы управления местоположением на вкладке управления эмулятором. Затем используйте вкладку «Вручную», чтобы установить долготу и широту, и нажмите «Отправить». Сделайте это, когда ваша программа работает, и вы видите вызов onLocationchanged. Это хорошая идея, чтобы войти в onLocationChanged.

Кстати, параметры в requestLocationUpdates установлены на "... 0,0 ..." - это разряжает вашу батарею - Я видел, как телефон разряжается через 6 - 8 часов - измените его на "... 30000, 100 ... "- первый параметр в миллисекундах, а другой - в метрах.

0 голосов
/ 15 июня 2012

как создать приложение?

Получение координат текущего местоположения по действию (получить местоположение) Шир. / Долг.

Разместите местоположение на веб-сервере для отображения на карте. (Отправить) Кнопка Очистить, чтобы очистить старое местоположение (Очистить местоположение) или включить (отправить), чтобы очистить (0.0.0.0)

Получение текущего местоположения GPS на Android http://developer.android.com/guide/topics/location/obtaining-user-location.html

0 голосов
/ 05 февраля 2011

Когда вы проверите его на эмуляторе, он выдаст 0.0. Вы должны передать локации в эмулятор. Вы можете передать это из файла C: \ android-sdk_r06 \ android-sdk-windows \ tools \ ddms.bat.

в ddms есть вкладка с именем управления эмулятором. оттуда вы можете передать локации в эмулятор. попробуй это. надеюсь, что это сработает.

...