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

标签 android gps

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

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

现在:我知道您可以使用 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_LOCKED toast 在 GPS 锁定时显示。如果我们再次调用 GPS 函数,如果 GPS_EVENT_FIRST_FIX 事件被锁定(显示 GPS_LOCKED toast)并且如果 GPS 已经开始搜索则不会显示 GPS_SEARCHING toast(即 GPS_STARTED 事件不会触发)。触发 GPS_EVENT_FIRST_FIX 事件后,我将删除 GPSstatus 监听器更新。

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

我希望这会帮助其他人......

关于Android:检查 GPS 是否正在搜索、已修复或未使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15453576/

相关文章:

android - 如何避免 Android 中的 GPS 漂移?

android - 在 Android 中选择 WiFi 接入点?

java - 我怎样才能在java中获取子进程的输出

iphone - 如何在 iPhone 上进行位置跟踪比一直打开 GPS 更有效?

android - 如何在Android应用程序中获取当前位置?

objective-c - 如何使用 CADisplayLink 在 CMRotationMatrix 上应用过滤器

Android Pay - 如何检测是否安装了 Android Pay?

java - Android http 响应不起作用

android - ARCore 中的相机校准(内在)参数

android - Android 谷歌地图中的 onLocationChanged 捕获的点太多