Intereting Posts
Android: layout_marginBottom, похоже, не работает должным образом в 2.2 (Froyo) Что означает «ActionBar недоступно для TabGroup»? Класс должен либо быть объявлен абстрактным, либо реализовать абстрактную ошибку метода Не указано десятичное место ввода номера HTML5 на некоторых устройствах Android / Chrome Знают ли значения в R.java во время выполнения или между прогонами? Ошибка: не удалось инициализировать класс com.android.ide.common.util.ReadWriteProcessLock после обновления до AS 2.4 StartActivity в подклассе приложения Как заполнить сетку с изображением, выбранным только из галереи или снятым с камеры Возможно ли установить приложение Android на устройстве Tizen OS? Кнопка скрытия скрытой клавиатуры Android Выход из системы Android Android SDK Файл Read Assets как строка Использование UnboundID SDK с файлом сертификата SSL для подключения к LDAP-серверу в приложении Android Не удалось создать проект Android в Eclipse Сходство между холстом HTML5 и холстом Android

Получение текущего местоположения 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