使用 LocationListener 监听位置,代码如下:
LocationListener locationListener = new LocationListener() { /** * 位置发生变化 * @param location */ @Override public void onLocationChanged(Location location) { } /** * GPS关闭 * @param provider */ @Override public void onProviderDisabled(String provider) { } /** * GPS开启 * @param provider */ @Override public void onProviderEnabled(String provider) { // 当GPS LocationProvider可用时,更新位置 setGpsStatus(0); } /** * GPS 状态发生变化 * @param provider * @param status * @param extras */ @Override public void onStatusChanged(String provider, int status, Bundle extras) { switch (status) { // GPS状态为可见时 case LocationProvider.AVAILABLE: break; // GPS状态为服务区外时 case LocationProvider.OUT_OF_SERVICE: break; // GPS状态为暂停服务时 case LocationProvider.TEMPORARILY_UNAVAILABLE: break; } } };
如上,onStatusChanged 应该是监听GPS状态变化的,是否连接中或断开,但我在测试时,一直未触发上面的代码,
后来我用连接卫星的个数来判断:
GpsStatus.Listener listener = new GpsStatus.Listener() { public void onGpsStatusChanged(int event) { switch (event) { // 第一次定位 case GpsStatus.GPS_EVENT_FIRST_FIX: break; // 卫星状态改变 case GpsStatus.GPS_EVENT_SATELLITE_STATUS: GpsStatus gpsStauts= locationManager.getGpsStatus(null); // 取当前状态 int maxSatellites = gpsStauts.getMaxSatellites(); //获取卫星颗数的默认最大值 Iteratorit = gpsStauts.getSatellites().iterator();//创建一个迭代器保存所有卫星 int gpsCount = 0; while (it.hasNext() && gpsCount <= maxSatellites) { GpsSatellite s = it.next(); //可见卫星数量 if(s.usedInFix()){ //已定位卫星数量 gpsCount++; } } if( gpsCount == 0 && gpsStatus == 1 ){ //setGpsStatus(0); } break; // 定位启动 case GpsStatus.GPS_EVENT_STARTED: break; // 定位结束 case GpsStatus.GPS_EVENT_STOPPED: break; } }; };
如果连接的个数为 0 表示GPS已掉线... 不过这样做还是有点问题,不是很准确 和 GPS Test
这个 APP 对比
请问大家,是写的不对还是什么原因?我主要是想获取GPS连接的状态,如果断开就实时显示,看网上有说
requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 0, locationListener);
这里的时间 和 距离设置的范围太大等问题,距离我有设置过 0,8等,时间有设置过 3000都测试过还是不行
请教大家怎么修改呢?先谢!!
GPS权限加了吗