Как получить местоположение GPS для Android
Привет, я пытаюсь получить текущее местоположение GPS через Android. Я последовал этому учебнику и статье Vogellas. Хотя он не работает. При использовании LocationManager.NETWORK_PROVIDER я всегда получаю широту 51 и долготу 9 - независимо от того, где я стою. При использовании LocationManager.GPS_PROVIDER я ничего не получаю.
Хотя все работает при использовании GMaps: S Не знаю, почему. Как я могу получить текущее местоположение GPS, например, GMaps?
Здесь мой код:
package com.example.gpslocation;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
public class GPS_Location extends Activity implements LocationListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gps__location);
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.gps__location, menu);
return true;
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
int latitude = (int) (location.getLatitude());
int longitude = (int) (location.getLongitude());
Log.i("Geo_Location", "Latitude: " + latitude + ", Longitude: " + longitude);
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
Ответы
Ответ 1
Вот ваша проблема:
int latitude = (int) (location.getLatitude());
int longitude = (int) (location.getLongitude());
Широта и долгота double
-значения, поскольку они представляют собой местоположение в градусах.
Отбрасывая их на int
, вы отбрасываете все за запятой, что имеет большое значение. См. "Десятичные градусы - Wiki"
Ответ 2
Попробуйте:
public LatLng getLocation()
{
// Get the location manager
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
String bestProvider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(bestProvider);
Double lat,lon;
try {
lat = location.getLatitude ();
lon = location.getLongitude ();
return new LatLng(lat, lon);
}
catch (NullPointerException e){
e.printStackTrace();
return null;
}
}
Ответ 3
Этот код имеет одну проблему:
int latitude = (int) (location.getLatitude());
int longitude = (int) (location.getLongitude());
Вы можете изменить int
на double
double latitude = location.getLatitude();
double longitude = location.getLongitude();
Ответ 4
Исходная проблема решается путем изменения lat
и lon
на двойной.
Я хочу добавить комментарий к решению с помощью Location location = locationManager.getLastKnownLocation(bestProvider);
Он работает, чтобы узнать последнее известное местоположение, когда для этого было занято другое приложение. Если, например, ни одно приложение не выполняло это с момента запуска устройства, код вернет нули (некоторое время я провел некоторое время, чтобы понять это).
Кроме того, рекомендуется прекратить прослушивание, если нет необходимости в этом locationManager.removeUpdates(this);
Кроме того, даже с разрешениями в manifest
, код работает, когда служба определения местоположения включена в настройках Android на устройстве.
Ответ 5
Выдержки: -
try
{
cnt++;scnt++;now=System.currentTimeMillis();r=rand.nextInt(6);r++;
loc=lm.getLastKnownLocation(best);
if(loc!=null){lat=loc.getLatitude();lng=loc.getLongitude();}
Thread.sleep(100);
handler.sendMessage(handler.obtainMessage());
}
catch (InterruptedException e)
{
Toast.makeText(this, "Error="+e.toString(), Toast.LENGTH_LONG).show();
}
Как вы можете видеть выше, поток работает вместе с основным потоком активности пользовательского интерфейса, который непрерывно отображает GPS lat, долгое время с текущим временем и случайным броском кубиков.
Если вам интересно, просто проверьте полный код:
Местоположение GPS с рандомизированным броском и текущим временем в отдельном потоке