在这种情况下,我使用 GPS 作为提供商,我尝试在建筑物内行走,但似乎找不到位置。是的,在大楼里 GPS 不起作用是有道理的。那么,为什么 isProviderEnabled 返回 true 呢?不管怎样,我应该如何实现“搜索 GPS 信号”?
String context = Context.LOCATION_SERVICE;
locman = (LocationManager)getSystemService(context);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locman.getBestProvider(criteria, true);
if (locman.isProviderEnabled( LocationManager.GPS_PROVIDER )) {
// Change from 'Searching for GPS signal to Use GPS'
txtGPS.setText("Use GPS");
}
locman.requestLocationUpdates(
provider,MIN_TIME, MIN_DISTANCE, locationListener);
最佳答案
isProviderEnabled()
仅查看您是否启用了 GPS,它不会关心您是否看到任何卫星!
如果您想检查是否有任何卫星,您必须使用gpslistener
,这是如何使用gpslistner:
/**
* Hier wird ein neuer GPSListener erstellt.
* Dieser Überprüft ob es Sichtbare Sattelitten gibt.
*/
mLocationManager.addGpsStatusListener(new GpsStatus.Listener() {
public void onGpsStatusChanged(int event) {
// Hier wird der EVENT gefiltert
// Dieser EVENT erscheint immer wenn GPS Satteliten in sicht sind
if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) {
// GpsStatus casten
GpsStatus status = mLocationManager.getGpsStatus(null);
// Interable sats instanzieren und casten
Iterable<GpsSatellite> sats = status.getSatellites();
// SATCOUNT instanzieren, wird benötigt um die Satteliten zu zählen
int SATCOUNT = 0;
// Interator satI instanzieren und casten.
Iterator<GpsSatellite> satI = sats.iterator();
// Hier wird die anzahl der Satteliten gezählt
while(satI.hasNext()){
// Den Interator auf den nächsten Satteliten verweisen
GpsSatellite satellite = satI.next();
// Satelitten zählen
SATCOUNT++;
Log.d("GPSListner", "While with SATCOUNT = " + SATCOUNT + " Elevation des Satellites = " + satellite.getElevation());
}
// Prüfen ob SATCOUNT 4 Satelitten hat
if(SATCOUNT > GPS_SAT_COUNT){
String test = String.valueOf(SATCOUNT);
Log.d("GPSSTATUS", "(true) Anzahl der Sattelitten: " + test );
// Boolean mGpsOk auf true setzen
GPSService.mGpsOk = true;
}else{
String test2 = String.valueOf(SATCOUNT);
Log.d("GPSSTATUS", "(fasle) Anzahl der Sattelitten: " + test2 );
// Boolean mGpsOk auf false setzen
GPSService.mGpsOk = false;
}
}
}
});
要使其正常工作,您需要启动一个想要使用 GPS 的位置管理器,现在您的 GPSlistner 可以检查 View 中是否有任何卫星并写入变量 true 或 false。之后您可以检查 Variabel。如果为真( View 中至少有 4 个卫星),您可以使用 Criteria.ACCURACY_FINE
,否则您可以使用 Criteria.ACCURACY_COARSE。
不要忘记为两者设置权限!
最诚挚的问候
Safari
关于android - 为什么 isProviderEnabled() 方法即使在建筑物内部也始终返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10411998/