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

1

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

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

Изображение 174551

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

  • 0
    Вы вводили данные "gpx" на эмуляторе или GPS включен на устройстве?
  • 0
    Я использую это на эмуляторе. Я также попробовал это: telnet localhost 5554 и затем geo fix 12 72 .. Это не работает. где я иду не так?
Показать ещё 8 комментариев
Теги:
android-layout
gps
android-maps

5 ответов

2
Лучший ответ

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

        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, но Изображение 174551

  • 0
    Позвольте мне попробовать это. Скажу вам после тестирования. Должен ли я проверить в телефоне?
  • 0
    Когда я переместил все вызовы tv.append в onLocationChanged, он мне ничего не показывал. onLocationChanged не вызывается.
Показать ещё 1 комментарий
2

У вас есть место в Onlocationchanged

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

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

Изображение 174551

  • 0
    Как я могу указать широту и долготу из DDMS?
  • 0
    Когда вы щелкнете по DDMS, откроется окно управления эмулятором. Если его там нет, вы откроете его из окна -> показать представление. В нем вы найдете Управление местоположениями. Перейдите на вкладку «Ручной», введите широту и долготу, нажмите «Отправить» и затем запустите. ваша программа
Показать ещё 2 комментария
1

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

0

Я думаю, что с эмулятором вы не можете получить координаты 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
    Смотрите пост здесь. о тестировании приложения GPS в эмуляторе firstdroid.com/2010/04/29/…
  • 0
    Я попробовал то, что вы сказали .. Это не работает ...
Показать ещё 3 комментария
0

Используйте 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() method, который даст вам асинхронные обновления вашего местоположения.

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().

  • 1
    Спасибо за ответ. Но это то, что я использовал. Посмотри на код.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню