Получение текущего местоположения GPS на Android

Я пытаюсь получить текущее местоположение пользователя с помощью возможностей 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 в качестве результата. Не удалось выяснить проблему.

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

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

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

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

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

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

Диаграмма последовательности

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

  • Объявить 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

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

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

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

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

Удостоверьтесь, что у вас есть это в манифесте
uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"

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

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

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

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

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

Получение текущих координат местоположения по действию (получить местоположение) Lat / long

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

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

Intereting Posts
Преобразование целого числа в строку без выделения памяти Фрагменты в Android 2.2.1, 2.3, 2.0. Это возможно? Обнаруживать, падает ли Человек Android Studio не может подключиться к Github через прокси-сервер Всегда доступный классический Bluetooth-модуль Предупреждение: игнорирование атрибута InnerClasses для анонимного внутреннего класса (org.ksoap2.transport.KeepAliveHttpsTransportSE $ 1) Android воспроизводит звуки после задержки Android Studio: Как я могу узнать, какие ресурсы не используются? Фиксированная позиция + переполнение-прокрутка: Android-прокрутка Chrome Chrome отключает прикосновение при остановке Как я могу найти строку текста в приложении Google Maps из PhoneGap на iOS и Android? Обнаружение при прокрутке scrollView Android – Как показать изображения из доступных ресурсов? Могу ли я хранить файлы изображений в firebase с помощью Java API? Сбросить максимальное количество текстовых просмотров Android Eclipse ADT: Java был запущен, но вернулся код выхода = 13