安卓:检查是否GPS正在搜索,有固定或不使用(Android: check if GPS is se

2019-07-21 18:48发布

我想知道是否有在安卓(姜饼)的方式知道此刻的GPS是做一些与否。 让我更清楚一点:我基本上要调用一些方法或API,它会告诉我wheter的GPS是:

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

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

Answer 1:

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敬酒来,只有当GPS启动时,GPS锁定搜索和GPS_LOCKED敬酒显示一次。 如果我们再次调用GPS功能,如果它被锁定(显示GPS_LOCKED面包)被触发GPS_EVENT_FIRST_FIX事件,如果GPS已经开始寻找它不会显示GPS_SEARCHING吐司(即GPS_STARTED事件不会触发)。 GPS_EVENT_FIRST_FIX事件被触发之后,我的去除GPSstatus监听更新。

当触发事件GPS_EVENT_FIRST_FIX,它能够更好地调用gpslastknownlocation()函数来获取新鲜最新的GPS定位。(其更好地寻找到Android开发者网站获取更多信息)。

我希望这会帮助别人....



Answer 2:

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

如果你喜欢冒险,你可以打电话叫$ dumpsys location从亚行外壳,以获得GPS提供者的状态。 通常你打电话$ adb shell从您的桌面,但是你可以编译一个原生的Android外壳应用程序,并调用的exec()从外壳内获得dumpsys直接在手机上输出。



文章来源: Android: check if GPS is searching, has fix or is not in use
标签: android gps