2011-02-05 2 views
4

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

написал простой класс, который реализует 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, как result.Couldn't выяснить проблемы.

+0

Если вы не хотите писать, что много кода и имеют более простой интерфейс, используйте https://github.com/delight-im/Android-SimpleLocation – caw

ответ

3

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

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

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

+0

Почему нет поддержки? Где вы ищете другой ответ? – Siddharth

0

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

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

2

После получения 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, параметры в запросеLocationUpdates установлены на «... 0,0 ...» - он разрядит вашу батарею - я видел, как телефон погас в течение 6 - 8 часов - измените его на «.. .30000, 100 ... "- первый параметр в миллисекундах, а другой - в метрах.

+0

«Если вы используете как NETWORK_PROVIDER, так и GPS_PROVIDER, вам нужно запросить ТОЛЬКО разрешение ACCESS_FINE_LOCATION, потому что оно включает разрешения для обоих поставщиков. (Разрешение для ACCESS_COARSE_LOCATION включает разрешение ТОЛЬКО для NETWORK_PROVIDER.)». Вам просто нужно добавить одно разрешение (ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION) не одновременно, а одновременно. – titusfx

18

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

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

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

Sequence diagram

Так из текущего кода:

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

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

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

+0

Большое спасибо за объяснение супер пупера. – Switch

+0

Добро пожаловать! –

+0

Это сработало .. журнал просто печатает значения lon/lat каждые 30 секунд. Теперь мне нужно получить эти значения и обновить интерфейс. – Switch

-3

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

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

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

Getting the current GPS location on Android http://developer.android.com/guide/topics/location/obtaining-user-location.html

+0

Не совсем конструктивный ответ на вопрос парней. –

Смежные вопросы