问题描述
使用 LocationListener 监听位置,代码如下:
LocationListener locationListener = new LocationListener() {/** * 位置发生变化 * @param location */@Overridepublic void onLocationChanged(Location location) {}/** * GPS关闭 * @param provider */@Overridepublic void onProviderDisabled(String provider) {}/** * GPS开启 * @param provider */@Overridepublic void onProviderEnabled(String provider) { // 当GPS LocationProvider可用时,更新位置 setGpsStatus(0);}/** * GPS 状态发生变化 * @param provider * @param status * @param extras */@Overridepublic 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(); //获取卫星颗数的默认最大值 Iterator<GpsSatellite> it = 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都测试过还是不行
请教大家怎么修改呢?先谢!!
问题解答
回答1:GPS权限加了吗