【问题标题】:GpsStatus.Listener works only if GPS is onGpsStatus.Listener 仅在 GPS 开启时有效
【发布时间】:2013-08-15 18:16:38
【问题描述】:

在我的应用程序中,当用户启用或禁用 GPS 时,我有一个 GpsStatus.Listener 来接收事件。如果 在我启动应用程序之前打开 GPS,一切正常。在这种情况下,每次打开或关闭 GPS 时,我都会收到 GPS_EVENT_STARTEDGPS_EVENT_STOPPED

问题是如果应用程序启动时 GPS 关闭。在这种情况下,如果我打开或关闭 GPS,我不会收到任何事件。

谁能给我解释一下?

这是我的代码:

public class GPSTracker implements android.location.GpsStatus.Listener {

    private final Context context;
    private final LocationListener locListener;
    private LocationManager locationManager;
    private boolean isGPSEnabled = false;

    public GPSTracker(Context context, LocationListener locListener) {
            this.context = context;
            this.locListener = locListener; 
            setupGPS();
    }

    private void setupGPS() {
            locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);                
            locationManager.addGpsStatusListener(this);
            isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            if(!isGPSEnabled) {
                    Toast.makeText(getContext(), "GPS disabled", Toast.LENGTH_SHORT).show();
            } else {        
                    locationManager.removeUpdates(locListener);
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME, MIN_DISTANCE, locListener);
            }
    }

    @Override
    public void onGpsStatusChanged(int event) {
            Log.e("onGpsStatusChanged", event+""); 
            switch(event) {
            case GpsStatus.GPS_EVENT_STARTED:
                    Log.e("onGpsStatusChanged", "GPS_EVENT_STARTED");
                    break;
            case GpsStatus.GPS_EVENT_STOPPED:
                    Log.e("onGpsStatusChanged", "GPS_EVENT_STOPPED");
                    break;
            }
    }

所以,我的 logcat 输出是(如果 GPS 在启动时打开):

  • GpsStatusChanged(24638): 1 // 应用启动
  • GpsStatusChanged(24638): GPS_EVENT_STARTED
  • GpsStatusChanged(24638): 4 // 搜索修复
  • GpsStatusChanged(24638): 4
  • GpsStatusChanged(24638): 2 // 关闭 GPS
  • GpsStatusChanged(24638):GPS_EVENT_STOPED

关闭 GPS 时的输出:无。

【问题讨论】:

    标签: android gps listener


    【解决方案1】:

    嗯,LocationListener 已提供:

    onProviderDisabled(),onProviderEnabled()onStatusChanged() 正是为了这个目的。

    GpsStatus.Listener 提供有关 GPS 服务内部运作的信息。它不能用于告诉 GPS Provider 的状态。

    LocationListener 提供有关提供商的信息。在您向位置提供商注册LocationListener 的那一刻,onProviderEnabled()/onProviderDisabled() 会被相应地调用,并且您的应用始终可以判断 GPS 何时打开或关闭。

    试试这个:

    public class test extends Activity implements LocationListener{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,10,this);
        }
    
    
        @Override
        public void onLocationChanged(Location location) {
        }
    
        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {
        }
    
        @Override
        public void onProviderEnabled(String s) {
            if(LocationManager.GPS_PROVIDER.equals(s)){
                Toast.makeText(this,"GPS on",Toast.LENGTH_SHORT).show();
            }
        }
    
        @Override
        public void onProviderDisabled(String s) {
            if(LocationManager.GPS_PROVIDER.equals(s)){
                Toast.makeText(this,"GPS off",Toast.LENGTH_SHORT).show();
            }
        }
    }
    

    【讨论】:

    • 感谢您的回复。但我的问题是关于 GpsStatus.Listener ;-)
    • @Namenlos 和GpsStatus.Listener 不适合检测提供者设置更改。这就是我要解释的。
    • "GpsStatus.Listener 传递有关 GPS 服务内部工作的信息。它不能用于告知 GPS Provider 的状态。" - 谢谢,这就是我想听到的。课程概览"Used for receiving notifications when GPS status has changed" 让我有点困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多