下面粘贴的是用于从用户获取坐标的类。但有时,我得到纬度和纵向为空。我知道这是因为我没有足够的网络,或者我在建筑物内,或者其他什么......但奇怪的是,在那一刻,我去了谷歌地图或其他地图应用程序,并且“地理定位我“按钮工作得很好。
我错过了别人没有的东西?
public class LocationActivity extends BaseActivity {
private LocationManager locationManager = null;
LocationListener onLocationChange=new LocationListener()
{
public void onLocationChanged(Location loc) {
LocalSession.lat = loc.getLatitude();
LocalSession.lng = loc.getLongitude();
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}
@Override
public void onPause() {
super.onPause();
locationManager.removeUpdates(onLocationChange);
}
@Override
public void onDestroy() {
super.onDestroy();
locationManager.removeUpdates(onLocationChange);
}
@Override
public void onResume() {
super.onResume();
try {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,10000.0f,onLocationChange);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,10000.0f,onLocationChange);
} catch (Exception e) {
}
}
}
答案 0 :(得分:3)
您在位置信息中获取NULL值,因为GPS_PROVIDER
需要开放天空来获取位置信息。
如果您使用NETWORK_PROVIDER
提供商,您可以在房间内获得位置信息,因为您的设备正在房间内获得网络覆盖。
您使用的代码包含提供程序
try
{
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,10000.0f,onLocationChange);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,10000.0f,onLocationChange);
} catch (Exception e) {}
因此,当您使用相同的LocationManager类对象时,第二个提供程序(GPS_PROVIDER)将替换第一个提供程序(NETWORK_PROVIDER)。
我的建议是使用以下任一方式,
答案 1 :(得分:1)
注意:尝试以下代码。这是使用GPS或网络获取位置的热门代码。那将在那里。
public Location getLocation() {
try {
locationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
// First get location from Network Provider
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
答案 2 :(得分:0)
我的建议是同时使用NETWORK_PROVIDER和GPS_PROVIDER,使用我在答案中发布的代码将结果输入卡尔曼滤波器:Smooth gps data。使用的信息越多越好。如果GPS和网络提供商的准确度估计值可靠,则卡尔曼滤波器方法将更好,即,只要伴随的精度指定,任何估计值都不可靠,无关紧要。