我有一个简单的班级GPSListener
,可以获得GPS坐标:
public class GPSListener implements LocationListener {
public static double latitude;
public static double longitude;
@Override
public void onLocationChanged(Location loc)
{
loc.getLatitude();
loc.getLongitude();
latitude = loc.getLatitude();
longitude = loc.getLongitude();
Log.d("GPSLISTENER ", "lat: "+latitude+" long:"+longitude);
} ...
然后尝试在我的活动中使用这个类,我只是在我的活动中调用onCreate()
函数中的类:
LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
LocationListener mlocListener = new GPSListener();
Criteria criteria = new Criteria();
String bestProvider = mlocManager.getBestProvider(criteria, false);
mlocManager.requestLocationUpdates(bestProvider, 0, 0, mlocListener);
mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
lat = GPSListener.latitude;
lon = GPSListener.longitude;
Log.d("GPS", "lat: "+lat+" long:"+lon);
} else {
// TODO: GPS not enabled
Log.d("GPSERROR", "GPS not enabled");
}
但每当我运行应用程序时,我的活动中的lat
和lon
始终为零。我不太确定如何解决这个问题。
记录时:
Log.d("GPSLISTENER ", "lat: "+latitude+" long:"+longitude);
它会返回正确的纬度和经度,在活动开始后只需要一两秒钟。
Log.d("GPSSUCCESS", "lat: "+lat+" long:"+lon);
两者都返回0.0。我的印象是.requestLocationUpdates
会在执行if语句之前将值传递给lat
和lon
。我怎么能做到这一点?
答案 0 :(得分:2)
您正在使用公共静态字段表示纬度,经度。
请将其更改为非静态并使用setter,getter with instant object:
lat = mlocListener.getLatitude();
lon = mlocListener.getLongitude();
答案 1 :(得分:1)
Google更新了其位置处理逻辑。现在,使用融合位置提供程序更容易收听位置更新。您可以在5分钟内实现您的位置监听器。看一看。 Methods for getting the most accurate location
您正在侦听gps提供程序,但尚未准备好(在等待位置状态时),然后它不会返回任何位置。只需看看融合位置提供程序并再次编写您的位置监听器。
答案 2 :(得分:1)
试试这个......
mGoogleMap.setOnMyLocationButtonClickListener(new OnMyLocationButtonClickListener() {
@Override
public boolean onMyLocationButtonClick()
{
try
{
Location myLocation = mGoogleMap.getMyLocation();
onLocationChanged(myLocation);
}
catch (Exception e)
{
Log.getStackTraceString(e);
}
return false;
}
});
使用此处理程序获取位置
private Handler customHandler = new Handler();
private Runnable updateTimerThread = new Runnable() {
@Override
public void run()
{
try
{
Location myLocation = mGoogleMap.getMyLocation();
secndLocationListener.onLocationChanged(myLocation);
}
catch (Exception e)
{
Log.getStackTraceString(e);
}
}
};
运行此
customHandler.postDelayed(updateTimerThread , 1000);
答案 3 :(得分:0)
LocationManager使用缓存中的最后一个已知位置。加载谷歌地图时,缓存会更新。试试这个,打开并检查你的位置。移动到大约200米的其他位置并再次检查您的位置。它将与旧的相同。现在,加载谷歌地图,你会发现你的应用程序神奇地现在有了新的位置。
您需要以编程方式将缓存踢到最新位置。唯一的方法是
YOUR_APPLICATION_CONTEXT.getLocationManager().requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onLocationChanged(final Location location) {
}
});