2013-07-15 73 views
6

如果有人能帮助我,我将不胜感激您的帮助。 我需要在我的应用程序中有一个准确的位置跟踪器,我希望它能像这样操作。 它找到了网络人的第一个位置,同时我开始请求GPS定位。当GPS给我一个位置,我想不再听网络位置。之后,我只想要从网络请求一个位置,只有在Gps不固定的情况下(不能给我一个位置)。当GPS再次修复时,我想停止收听网络,这是我想要实现的循环,因为GPS更加灵活,我希望将网络本地化作为备份。 我看到这个帖子,但我似乎无法理解如何使其适应我的需要,就需要根据GPS状态可互换网络和GPS位置提供者android

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

出主意,谢谢提前#1 Comunity。

回答

1

1.停止侦听网络位置更新: 这样做非常简单。只需拨打

your_loc_manager.removeUpdates(network_location_listener); 

2.获取位置从网络提供商,如果GPS提供商没有给出任何解决 你可以尝试像下面给出的(而不是定时器,你可以尝试使用GpsStatus监听器...)

用于获取网络提供商的更新

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修复完成,GPSFix将更改其值,并且该链接中的现有代码将停止查找网络更新。至少这是我能理解的你想达到的目标可能是我没完全理解你

编辑2: 这是我处理了GPS和网络提供商

的mapActivity或任何你需要获得位置更新,你需要创建这个MyLocation类的实例类。此外,要继续获取位置更新信息,您需要在您的通话活动中实施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"); 
    } 
} 
+0

//你应该打电话给你基于某些 //条件这会告诉你是否真的需要问的网络位置获取网络位置的方法。 我的评论: 这是我的问题,我似乎无法找到一种方式来形成该条件,条件是如果gps是固定的或不。 GPS启用与否的问题不是问题,问题在于了解gps是否能够响应或正在搜索卫星(这就是我的意思是固定或搜索) –

+0

然后,我认为你应该看看这[回答](http://stackoverflow.com/a/6782146/430480)。它几乎在做你想做的事情。如果(hasGPSFix) { Log.i(“GPS”,“Fix Lost(expired)”); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,2000,10,locationListener); } hasGPSFix = false;'这里你应该请求GPS和网络更新。这应该这样做,因为相关的处理似乎已经在那里时,GPS Fix已被再次获得 – Rajeev

+0

这个答案是无效的,我试过,因为他使用的方法 Global.getInstance()。currentGPSLocation这是一个无效的方法,doesn'从我所看到的全球课堂中存在。另一件事是,我不需要知道什么时候从GPS获取更新,我需要知道什么时候从网络获取更新(我的意思是我需要知道什么时候GPS正在搜索,而不是当它是固定的)。以及如何控制网络和GPS之间的互换性。 –

相关问题