使用 LTE 而不是 WiFi 获取位置数据时遇到问题
Trouble getting location data using LTE rather than WiFi
我正在尝试为使用 4G/LTE 的设备获取 Lat/Long。下面的代码在使用 WiFi 时效果很好,但在使用 4G/LTE 时根本不会调用 onLocationChanged
方法。知道为什么吗?
我只有有限的 window 来获取位置坐标,因为它们需要在开始时附加到审核日志中。
LTE/4G 是否通常比 WiFi 花费更长的时间来查明 lat/long?
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
if (networkType.equals("WiFi")) {
lp = LocationManager.NETWORK_PROVIDER;
}
else {
lp = LocationManager.GPS_PROVIDER;
}
locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
gpsTestLocation = locationStringFromLocation(location);
System.out.println("mcsoutput location: " + gpsTestLocation);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
// Register the listener with the Location Manager to receive location updates
lm.requestLocationUpdates(lp, 0, 0, locationListener);
网络类型由以下公式计算得出:
private String checkNetworkState() {
ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
// NetworkInfo mEthernet = connManager.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET);
NetworkInfo m3G = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
TelephonyManager telephonyService = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if (mWifi!=null) isOnWifi = mWifi.isConnected();
if (m3G!=null) is3G = m3G.isConnected();
if(isOnWifi == true) {
return "WiFi";
}
else {
int cellType = telephonyService.getNetworkType();
return isConnectionFast(cellType);
}
}
您在使用 wifi 时使用 NETWORK_PROVIDER,在关闭时使用 GPS。很可能您没有获得 GPS 同步。在室内实际上很难做到。您是否在通知栏中看到闪烁的 GPS 符号?如果是这样,您将无法获得完整的 GPS 同步,因此不会调用 onLocationChanged。
在 wifi 上使用 NETWORK_PROVIDER 时,您几乎可以立即获得位置,因为 NETWORK_PROVIDER 不需要卫星并且几乎总是可用,只是不太准确。
我正在尝试为使用 4G/LTE 的设备获取 Lat/Long。下面的代码在使用 WiFi 时效果很好,但在使用 4G/LTE 时根本不会调用 onLocationChanged
方法。知道为什么吗?
我只有有限的 window 来获取位置坐标,因为它们需要在开始时附加到审核日志中。
LTE/4G 是否通常比 WiFi 花费更长的时间来查明 lat/long?
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
if (networkType.equals("WiFi")) {
lp = LocationManager.NETWORK_PROVIDER;
}
else {
lp = LocationManager.GPS_PROVIDER;
}
locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
gpsTestLocation = locationStringFromLocation(location);
System.out.println("mcsoutput location: " + gpsTestLocation);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
// Register the listener with the Location Manager to receive location updates
lm.requestLocationUpdates(lp, 0, 0, locationListener);
网络类型由以下公式计算得出:
private String checkNetworkState() {
ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
// NetworkInfo mEthernet = connManager.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET);
NetworkInfo m3G = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
TelephonyManager telephonyService = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if (mWifi!=null) isOnWifi = mWifi.isConnected();
if (m3G!=null) is3G = m3G.isConnected();
if(isOnWifi == true) {
return "WiFi";
}
else {
int cellType = telephonyService.getNetworkType();
return isConnectionFast(cellType);
}
}
您在使用 wifi 时使用 NETWORK_PROVIDER,在关闭时使用 GPS。很可能您没有获得 GPS 同步。在室内实际上很难做到。您是否在通知栏中看到闪烁的 GPS 符号?如果是这样,您将无法获得完整的 GPS 同步,因此不会调用 onLocationChanged。
在 wifi 上使用 NETWORK_PROVIDER 时,您几乎可以立即获得位置,因为 NETWORK_PROVIDER 不需要卫星并且几乎总是可用,只是不太准确。