Я хочу показать широту и долготу моего текущего местоположения. Для этого, а не поиска в 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>
Смотрите вывод, который я получаю:
Где я иду не так? Я не понимаю, его простой код и почему он не работает?
Я просто проверил ваш код, и он работает с этими изменениями, вам просто нужно переместить вызовы 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, но
У вас есть место в Onlocationchanged
public void onLocationChanged(Location loc) {
latitude = loc.getLatitude();
longitude = loc.getLongitude();
Log.i("MyLocation",Double.toString(latitude)+" "+Double.toString(longitude));
}
поэтому высота и долгота будут отображаться только при изменении текущего местоположения. Для проверки вы даете некоторую широту и долготу и отправляете с вашего управления эмулятором в DDMS, после чего вы запускаете свою программу. Убедитесь, что она покажет местоположение.
Если вы запустите эту программу на устройстве, тогда она покажет широту и долготу 0.0 до тех пор, пока мы не изменим нашу позицию. Вы должны двигаться не менее чем на 10 метров от вашей текущей позиции, чтобы увидеть результат. Поскольку без изменений текущая позиция onLocationChange()
метод не срабатывает, а выход будет 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
}
Я проверил это, переместив устройство из одного места в другое...
Надеюсь, это поможет...
Используйте 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()
.