gpt4 book ai didi

android - 根据 gps 状态 android 可互换的网络和 GPS 位置提供者

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:39:10 25 4
gpt4 key购买 nike

如果有人能帮助我,我将不胜感激。我需要在我的应用程序中有一个准确的位置跟踪器,我希望它像这样。它找到了有网络的人的第一个位置,同时我开始请求 GPS 定位。当 gps 给我一个位置时,我不想再听网络位置了。之后我只想从网络请求一个位置,并且只有在 Gps 不固定的情况下(不能给我一个位置)。当 Gps 再次固定时,我想停止收听网络,这是我想实现的循环,因为 GPS 更准确,我想将网络定位作为备份。我看过这篇文章,但我似乎无法理解如何使其适应我的需要,

How can I check the current status of the GPS receiver?

需要想法,提前感谢 Stackoverflow 社区。

最佳答案

<强>1。停止监听网络位置更新:这样做非常简单。只需调用

your_loc_manager.removeUpdates(network_location_listener);

<强>2。如果 GPS 提供商未提供任何修复,则从网络提供商处获取位置您可以尝试下面给出的方法(而不是计时器,您可以尝试使用 GpsStatus Listener ...)

在获取网络提供商更新的方法中

boolean network_enabled ;
try {
network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch(Exception ex) {
ex.printStackTrace();
}

if(!network_enabled)
return;

locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 100, networkLocationListener);

return;

获取GPS位置的方法内部

boolean gps_enabled;
try {
gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch(Exception ex) {
ex.printStackTrace();
}

if(!gps_enabled) {
// call your method for getting network location updates
return;
}

locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 50, locationListenerGps);
new Timer().schedule(new TimerTask() {

@Override
public void run() {
// You should call your method of getting Network locations based on some
// condition which would tell whether you really need to ask for network location

}
}, 20000 /* Time Value after which you want to stop trying for GPS and switch to Network*/);

编辑 1:

此外“我不需要知道何时从 GPS 获取更新,我需要知道何时从网络获取更新(我的意思是我需要知道 gps 何时搜索,而不是何时修复)。以及如何控制网络和GPS之间的互换性"

...如果修复已丢失,那么您只需要查找网络更新,所以我建议您调用

if (hasGPSFix) { 
Log.i("GPS","Fix Lost (expired)");
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 2000, 10, locationListener); //===> new line which I am suggesting
}
hasGPSFix = false;

这样,您将从网络获取位置更新,而 GPS 将继续尝试修复。一旦实现 GPS 定位 hasGPSFix 将更改其值,并且所述链接中的现有代码将停止寻找网络更新。至少这是我能理解的你想要实现的目标。可能是我没有完全理解你。

编辑 2:这是我处理 GPS 和 NETWORK 提供商的类(class)

mapActivity 或任何需要获取位置更新的地方,您需要创建此 MyLocation 类的实例。此外,要继续获取位置更新,您需要在调用 Activity 中实现 LocationResultpublic abstract void gotLocation(Location location, boolean isGpsData); 会告诉你刚才收到的更新是来自网络还是来自 GPS。此外,如果从 GPS 返回数据,它会自动关闭网络监听器。如果您需要来自 GPS 等的数据,则需要调用 getFineLocation() 方法。您将需要根据您的目的增强给定的代码(就像您需要增强 closeListeners() 方法以在您只想删除网络更新时仅关闭一个提供者等...),但它提供了您想要的基本实现(当然还有 GpsStatus.Listener 实现,因此两者结合起来应该可以很好地满足您的目的)。

public class MyLocation {
LocationManager locManager;
LocationResult locationResult;
boolean gps_enabled = false;
boolean network_enabled = false;

public boolean getCoarseLocation(Context context, LocationResult result) {
locationResult = result;
if(locManager == null)
locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

try {
network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch(Exception ex) {
ex.printStackTrace();
}

if(!network_enabled)
return false;

locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 100, networkLocationListener);
return true;
}

public boolean getFineLocation(Context context, LocationResult result) {
locationResult = result;
if(locManager == null)
locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

try {
gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch(Exception ex) {

}

if(!gps_enabled)
return false;//No way to get location data

locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 100, locationListenerGps);
return true;
}

LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location) {
locationResult.gotLocation(location,true);
locManager.removeUpdates(networkLocationListener);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};

LocationListener networkLocationListener = new LocationListener() {
public void onLocationChanged(Location location) {
locationResult.gotLocation(location,false);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};

public void closeListeners() {
if(locManager == null)
return;

if(locationListenerGps != null)
locManager.removeUpdates(locationListenerGps);
if(networkLocationListener != null)
locManager.removeUpdates(networkLocationListener);
}

public static abstract class LocationResult {
public abstract void gotLocation(Location location, boolean isGpsData);
}

public static boolean hasNetworkProvider(Context mContext) {
List<String> myProvidersList = ((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).getProviders(false);
return myProvidersList.contains("network");
}

public static boolean hasGPSProvider(Context mContext) {
List<String> myProvidersList = ((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).getProviders(false);
return myProvidersList.contains("gps");
}
}

关于android - 根据 gps 状态 android 可互换的网络和 GPS 位置提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17656489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com