我有一个使用LocationManager的Android应用程序获取单元网络位置而不是Wifi位置?如果我关闭了Wifi天线并执行以下操作:
LocationManager lm = (LocationManager) paramContext.getSystemService(Context.LOCATION_SERVICE);
Location location = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
我总是返回Wifi位置而不是小区网络位置。我希望它返回单元格位置,因为我已从Wifi位置移动。我尝试使用LocationListener但似乎没有帮助。
这是在运行Froyo的HTC Evo上运行。
谢谢!
答案 0 :(得分:1)
我不相信你可以。
网络位置提供商查看wifi状态和单元状态,如果太旧则丢弃一个,或者通过MASF服务器将它们发送到Google Location Server(GLS)。那里做了什么魔术。但您可以查看NetworkProvider的实现,并了解如何调整代码。代码在这里:NetworkLocationProvider。
如果您只想要小区ID,请查看Telephony Manager。在那里添加PhoneStateListener。
答案 1 :(得分:0)
请查看Android开发指南中的此部分:Requesting Location Updates。基本上,您需要注册一个侦听器以获取位置更新,然后告诉Android您希望通过网络位置提供程序获取这些更新。
// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
makeUseOfNewLocation(location);
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};
// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
然后,您应该能够使用getLastKnownLocation()获取最后一个已知位置和/或使用LocationListener中的onLocationChanged()。
答案 2 :(得分:0)
如果你现在有答案我不会,但你是否尝试在网络信息上写一些逻辑并获得你所处的网络类型?并进行定位服务电话。
public boolean haveNetworkConnection()
{
boolean haveConnectedWifi = false;
boolean haveConnectedMobile = false;
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo)
{
if (ni.getTypeName().equalsIgnoreCase("WIFI"))
if (ni.isConnected())
haveConnectedWifi = true;
if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
if (ni.isConnected())
haveConnectedMobile = true;
}
return haveConnectedWifi || haveConnectedMobile;
}