Android:检查GPS是否正在搜索、修复或未使用



我想知道是否有一种方法在Android (GingerBread)知道如果在此刻GPS正在做的事情或没有。让我更清楚一点:我基本上想调用一些方法或api来告诉我GPS是否为:

1)固定(GPS图标在状态栏上)
2)搜索修复(状态栏GPS图标闪烁)
3)不活动(目前没有应用程序正在使用位置服务,状态栏上没有图标)

现在:我知道你可以使用一个LocationListener来通知这些变化,但这对我来说并不好,因为我不希望我的代码保持运行等待等待事件,我的代码定期运行在预定的时间,做一些事情,然后终止,所以我需要一种方法来检查GPS服务的状态在那个精确的时刻,而不是等待通知当它改变。

在GPS上做了大量的测试后,我终于找到了解决方案。当android应用程序调用位置管理器和GPS开始搜索时,一个事件被触发,当GPS被锁定时,另一个事件被触发。下面的代码展示了如何做到这一点。

locationManager = (LocationManager)mContext.getSystemService(LOCATION_SERVICE);
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (isGPSEnabled) {                 
        if (locationManager != null) {
            // Register GPSStatus listener for events
            locationManager.addGpsStatusListener(mGPSStatusListener); 
            gpslocationListener = new LocationListener() {
                public void onLocationChanged(Location loc) {}
                public void onStatusChanged(String provider, int status, Bundle extras) {}
                public void onProviderEnabled(String provider) {}
                public void onProviderDisabled(String provider) {}                          
            };  
               locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                MIN_TIME_BW_UPDATES_GPS, MIN_DISTANCE_CHANGE_FOR_UPDATES_GPS,
                gpslocationListener);           
        }
    }

/**这是GPSListener函数调用时,各种事件发生,如* GPS启动,GPS停止,GPS锁定*/

public Listener mGPSStatusListener = new GpsStatus.Listener() {  
    public void onGpsStatusChanged(int event) {     
        switch(event) {
            case GpsStatus.GPS_EVENT_STARTED:
                Toast.makeText(mContext, "GPS_SEARCHING", Toast.LENGTH_SHORT).show();
                System.out.println("TAG - GPS searching: ");                        
                break;
            case GpsStatus.GPS_EVENT_STOPPED:    
                System.out.println("TAG - GPS Stopped");
                break;
            case GpsStatus.GPS_EVENT_FIRST_FIX:
                /*
                 * GPS_EVENT_FIRST_FIX Event is called when GPS is locked            
                 */
                    Toast.makeText(mContext, "GPS_LOCKED", Toast.LENGTH_SHORT).show();
                    Location gpslocation = locationManager
                            .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    if(gpslocation != null) {       
                    System.out.println("GPS Info:"+gpslocation.getLatitude()+":"+gpslocation.getLongitude());
                    /*
                     * Removing the GPS status listener once GPS is locked  
                     */
                        locationManager.removeGpsStatusListener(mGPSStatusListener);                
                    }               
                break;
            case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
 //                 System.out.println("TAG - GPS_EVENT_SATELLITE_STATUS");
                break;                  
       }
   }
};  

最好将GPS代码放入和作为服务来获取GPS位置信息。

每次调用GPS功能,都会注册GPSStatus侦听器。GPS_SEARCHING toast只在GPS启动搜索时出现一次,GPS锁定时显示GPS_LOCKED toast。如果我们再次调用GPS函数,GPS_EVENT_FIRST_FIX事件被触发,如果它被锁定(显示GPS_LOCKED toast),如果GPS已经开始搜索,它将不会显示GPS_SEARCHING toast(1)。(GPS_STARTED事件不会触发)。GPS_EVENT_FIRST_FIX事件触发后,我正在删除GPSstatus侦听器更新。

当触发GPS_EVENT_FIRST_FIX事件时,最好调用gpslastknownlocation()函数来获取最新的GPS修复。(你最好去Android开发者网站了解更多信息)。

希望对大家有所帮助....

不幸的是,在Android中没有简单的方法来获取GPS的"当前状态"。正如其他人指出的那样,您最好的选择是注册onGpsStatusChanged()事件并跟踪状态。

如果您感到冒险,您可以从adb shell调用call $ dumpsys location来获取gps提供程序的状态。你通常从你的桌面调用$ adb shell,但你可以编译一个本地的android外壳应用程序,并从外壳内部调用exec(),直接在手机上获得dumpsys输出

最新更新