5

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

1)已修复(状态栏上的 GPS 图标打开)
2)正在搜索修复(状态栏上的 GPS 图标闪烁)
3)未激活(目前没有应用正在使用定位服务,状态栏上没有图标)

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

4

2 回答 2

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 toast),则触发 GPS_EVENT_FIRST_FIX 事件,如果 GPS 已经开始搜索,则不会显示 GPS_SEARCHING toast(即 GPS_STARTED 事件不会触发)。触发 GPS_EVENT_FIRST_FIX 事件后,我将删除 GPSstatus 侦听器更新。

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

我希望这对其他人有帮助....

于 2013-12-28T07:52:27.090 回答
1

Unfortunately, there's no easy way to get the "current state" of the GPS in Android. Like others have pointed out, your best bet is to register for the onGpsStatusChanged() event and track the state.

If you are feeling adventurous, you can call call $ dumpsys location from an adb shell to get the state of the gps provider. You usually call $ adb shell from your desktop, but you can compile a native android shell app, and call an exec() from inside the shell to get the dumpsys output directly on the phone.

于 2013-04-23T09:56:20.747 回答