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

时间:2013-03-16 19:17:20

标签: android gps

我想知道Android(GingerBread)中是否有办法知道GPS目前是否正在做某事。让我更清楚一点:我基本上想要调用一些方法或api来告诉我GPS是什么:

1)固定(状态栏上的GPS图标)
2)搜索修复(状态栏上的GPS图标闪烁)
3)无效(目前没有应用使用位置服务,状态栏上没有图标)

现在:我知道您可以使用LocationListener来通知此类更改但这对我不利,因为我不希望我的代码继续运行等待等待事件,我的代码在预定时间定期运行,做了什么,然后终止,所以我需要一种方法来检查GPS服务在这个精确时刻的状态,而不是等待它何时发生变化的通知。

2 个答案:

答案 0 :(得分:12)

在对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_LOCKED toast在GPS锁定时显示。如果我们再次呼叫GPS功能,如果GPS_EVENT_FIRST_FIX事件被锁定(显示GPS_LOCKED吐司),并且GPS已经开始搜索,它将不会显示GPS_SEARCHING toast(即GPS_STARTED事件不会触发)。触发GPS_EVENT_FIRST_FIX事件后,我将删除GPSstatus监听器更新。

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

我希望这会有助于其他人......

答案 1 :(得分:1)

不幸的是,没有简单的方法可以在Android中获得GPS的“当前状态”。像其他人指出的那样,最好的办法是注册onGpsStatusChanged()事件并跟踪状态。

如果您有冒险精神,可以从adb shell拨打电话$ dumpsys location以获取gps提供商的状态。您通常从桌面调用$ adb shell,但您可以编译本机Android shell应用程序,并从shell中调用exec()直接在手机上获取dumpsys输出。