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

Я хочу отображать широту и долготу моего текущего местоположения. Для этого вместо поиска в Google я искал в SO.

Я просто хочу отобразить широту и долготу моего текущего местоположения.

Смотрите мой код ниже:

public class LocationGetter extends Activity {

@Override

public void onCreate(Bundle savedInstanceState)
{

super.onCreate(savedInstanceState);

TextView tv = new TextView(this);

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

LocationListener mlocListener = new LocationManagerHelper();

mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 100,mlocListener);

if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        tv.append("Latitude:- " + LocationManagerHelper.getLatitude()
                + '\n');
        tv.append("Longitude:- " + LocationManagerHelper.getLongitude()
                + '\n');

        Log.i("MyLocation1",Double.toString(LocationManagerHelper.getLatitude())+" "+Double.toString(LocationManagerHelper.getLongitude()));

} else {
    tv.setText("GPS is not turned on...");
}

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

}

/* Class My Location Listener */

public static class LocationManagerHelper implements LocationListener {

    private static double latitude;
    private static double longitude;

    @Override
    public void onLocationChanged(Location loc) {
        latitude = loc.getLatitude();
        longitude = loc.getLongitude();
        Log.i("MyLocation",Double.toString(latitude)+" "+Double.toString(longitude));
    }

    @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;
    }

}

} 

Я также добавил разрешение в файле манифеста:

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

Смотрите вывод, который я получаю:

введите здесь описание изображения

Где я ошибаюсь? Я не понимаю, это простой код и почему он не работает?


person Kartik Domadiya    schedule 07.04.2011    source источник
comment
Вы загружали данные gpx на эмулятор или на устройстве включен GPS?   -  person Swaroop    schedule 07.04.2011
comment
Я использую его на эмуляторе. Я также пробовал это: telnet localhost 5554, а затем geo fix 12 72. Это не работает. где я ошибаюсь?   -  person Kartik Domadiya    schedule 07.04.2011
comment
Пробовали ли вы также использовать элемент управления эмулятором DDMS Eclipse ADT? вручную зафиксировать точку?   -  person Swaroop    schedule 07.04.2011
comment
Нет. Я не знаю об этом. Не могли бы вы рассказать мне об этом? как исправить точку?   -  person Kartik Domadiya    schedule 07.04.2011
comment
Если у вас установлен подключаемый модуль Eclipse ADT, проверьте это developer.android.com /guide/developing/debugging/ddms.html   -  person Swaroop    schedule 07.04.2011
comment
Я тоже считаю, что вы должны добавить, чтобы издеваться над местоположением. <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />   -  person Swaroop    schedule 07.04.2011
comment
Я опробовал ваш код, и с небольшими изменениями он работает. Посмотрите на мой ответ ниже   -  person Swaroop    schedule 07.04.2011
comment
@проголосовавший против : за меня проголосовали против ?   -  person Kartik Domadiya    schedule 07.04.2011
comment
@Kartik, если я попытаюсь создать класс LocationManagerHelper как статический класс, я получу сообщение об ошибке с сообщением о недопустимом модификаторе?   -  person noloman    schedule 06.08.2011


Ответы (5)


Я только что проверил ваш код, и он работает с этими изменениями, вам просто нужно переместить вызовы tv.append() в метод onLocationChanged(), поскольку он вызывается каждый раз, если вы не используете его для обратного вызова, тогда вы получите первые установленные значения только и выполняется только один раз.

        public void onLocationChanged(Location loc) {
            latitude = loc.getLatitude();
            longitude = loc.getLongitude();
            Log.i("MyLocation",Double.toString(latitude)+" "+Double.toString(longitude));
            tv.append("Latitude:- " + LocationManagerHelper.getLatitude()
                    + '\n');
            tv.append("Longitude:- " + LocationManagerHelper.getLongitude()
                    + '\n');

            Log.i("MyLocation1",Double.toString(LocationManagerHelper.getLatitude())+" "+Double.toString(LocationManagerHelper.getLongitude()));

        }

и я использовал эти разрешения в AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />    
<uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES" />    

Вы можете просмотреть их и отфильтровать те, которые вам не интересны. Я использовал загруженный файл .gpx с сайта здесь

Однако я тестировал его на Android 2.2, Location Updates working

person Swaroop    schedule 07.04.2011
comment
Позвольте мне попробовать это. Расскажу после тестирования. Должен ли я тестировать в телефоне? - person Kartik Domadiya; 07.04.2011
comment
Когда я переместил все вызовы tv.append в onLocationChanged, он мне ничего не показал. onLocationChanged не вызывается. - person Kartik Domadiya; 07.04.2011
comment
Вы также должны отправлять обновления местоположения, чтобы onLocationChanged вызывался из панели управления эмулятором DDMS. Для этого вы можете использовать эмулятор или устройство (включить реальные обновления GPS / макеты). Я тестировал на эмуляторе Android 2.2. - person Swaroop; 07.04.2011

Вы получили местоположение в Onlocationchanged

 public void onLocationChanged(Location loc) {
    latitude = loc.getLatitude();
    longitude = loc.getLongitude();
    Log.i("MyLocation",Double.toString(latitude)+" "+Double.toString(longitude));
  }

поэтому широта и долгота будут отображаться только при изменении текущего местоположения. Для проверки вы указываете некоторую широту и долготу и отправляете из своего управления эмулятором в DDMS, а после этого запускаете свою программу. Конечно, она покажет местоположение.

введите здесь описание изображения

person adithi    schedule 07.04.2011
comment
Как я могу передать широту и долготу из DDMS? - person Kartik Domadiya; 07.04.2011
comment
Когда вы нажмете на DDMS, появится окно управления эмулятором. Если его нет, вы откроете его из окна->показать вид. В нем вы найдете элементы управления местоположением. ваша программа - person adithi; 07.04.2011
comment
Да, спасибо, теперь все готово.. отправка из управления эмулятором в порядке.. получу ли я свое текущее местоположение, если я установлю это приложение на свой мобильный телефон? - person Kartik Domadiya; 07.04.2011
comment
Спасибо за ответ .. Голосую за то, что научили меня использовать DDMS .. спасибо - person Kartik Domadiya; 07.04.2011

Если вы запустите эту программу на устройстве, она покажет широту и долготу 0,0, пока мы не изменим нашу позицию. Вы должны отойти не менее чем на 10 метров от вашего текущего положения, чтобы увидеть вывод. Потому что без изменения текущей позиции метод onLocationChange() не срабатывает, и вывод будет 0,0.

person Sajal Saha    schedule 27.09.2012

Используйте LocationManager.

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
double longitude = location.getLongitude();
double latitude = location.getLatitude();

Вызов getLastKnownLocation() не блокируется — это означает, что он вернет null, если в настоящее время нет доступной позиции — поэтому вы, вероятно, захотите взглянуть на передачу LocationListener на requestLocationUpdates() метод вместо этого, что даст вам асинхронные обновления вашего местоположения .

private final LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
        longitude = location.getLongitude();
        latitude = location.getLatitude();
    }
}

lm.requestLocationUpdates(LocationManager.GPS, 2000, 10, locationListener);

Вам потребуется предоставить приложению ACCESS_FINE_LOCATION разрешение если вы хотите использовать GPS.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Вы также можете добавить ACCESS_COARSE_LOCATION разрешение. на случай, если GPS недоступен, и выберите поставщика услуг определения местоположения с помощью getBestProvider()метод.

person Udaykiran    schedule 07.04.2011
comment
Спасибо за ответ. Но это то, что я использовал. Посмотрите на код. - person Kartik Domadiya; 07.04.2011

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

Приведенный ниже код только что я протестировал, и он работает для меня.

 import android.app.Activity;
 import android.content.Context;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
 import android.os.Bundle;
 import android.widget.Toast;

 public class GetGPS extends Activity {

String GPSPROVIDER = LocationManager.GPS_PROVIDER;
private  static final long MIN_GEOGRAPHIC_POOLING_TIME_PERIOD = 10000;
private  static final float MIN_GEOGRAPHIC_POOLING_DISTANCE = (float)5.0;

public LocationManager gpsLocationManager;

static Context context = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    context = this;

    /*Get a listener for GPS*/
    LocationListener gpsLocationListener = null;

    gpsLocationListener = new GpsLocationListener(this);

    /*Start Location Service for GPS*/
    gpsLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    /*Register GPS listener with Location Manager*/
    gpsLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
            MIN_GEOGRAPHIC_POOLING_TIME_PERIOD,
            MIN_GEOGRAPHIC_POOLING_DISTANCE, gpsLocationListener);

    boolean isavailable = gpsLocationManager.isProviderEnabled(GPSPROVIDER);

    if(isavailable) {

        Location loc = gpsLocationManager.getLastKnownLocation("gps");

        if(loc != null) {
            double latitude = loc.getLatitude();
            double longitude = loc.getLongitude();

            Toast.makeText(GetGPS.this,"Longitude is  "+longitude + "   Latitude is   "+latitude, Toast.LENGTH_LONG).show();

        }
    }

}

public static class GpsLocationListener implements LocationListener {


    public GpsLocationListener(Context context){

    }

    public void onLocationChanged(Location loc) {

        if (loc != null) {

            double latitude = loc.getLatitude();
            double longitude = loc.getLongitude();

            Toast.makeText(context,"Longitude is  "+longitude + "   Latitude is   "+latitude, Toast.LENGTH_LONG).show();

        }

    }//End of onLocationChanged Method

    @Override
    public void onProviderDisabled(String provider) {

    }//End of onProviderDisabled Method

    @Override
    public void onProviderEnabled(String provider) {

    }//End of onProviderEnabled Method

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


    }//End of onStatusChanged Method

}//End of GpsLocationListener class
}

Я проверил это, перемещая устройство из одного места в другое...

надеюсь поможет..

person uday    schedule 07.04.2011
comment
Смотрите сообщение здесь. о тестировании приложения GPS в эмуляторе firstdroid.com/2010/04/29/ - person Kartik Domadiya; 07.04.2011
comment
Вы можете пройти через приведенный выше код, который я разместил. Он работает для меня. В нем есть прослушиватель, который прослушивает каждые 10 секунд, чтобы получить координаты GPS. - person uday; 07.04.2011
comment
Вы пробовали для триангуляции in-an/3145655#3145655" title="Какой самый простой и надежный способ получить текущее местоположение пользователей в"> stackoverflow.com/questions/3145089/ .. можете ли вы помочь мне в реализации этого ?..просто дайте идею, связанную с этим ›? - person Kartik Domadiya; 07.04.2011