Проблема в получении текущего местоположения в Android - PullRequest
1 голос
/ 07 апреля 2011

Я хочу отобразить широту и долготу моего текущего местоположения. Для этого вместо поиска в 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>

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

enter image description here

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

Ответы [ 5 ]

2 голосов
/ 07 апреля 2011

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

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

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

enter image description here

2 голосов
/ 07 апреля 2011

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

        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

1 голос
/ 27 сентября 2012

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

0 голосов
/ 07 апреля 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
}

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

Я надеюсь, что это поможет ..

0 голосов
/ 07 апреля 2011

Используйте 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() метода .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...