你如何使Android LocationManager使用Cell网络而不是Wifi网络?

时间:2010-10-19 15:35:15

标签: android wifi cell locationmanager

我有一个使用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上运行。

谢谢!

3 个答案:

答案 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;
}