我遇到的问题是LocationManager没有提供最后一个已知位置而没有更新位置。 代码已经工作,并且在某些条件下仍然有效。简而言之,我执行以下操作,是的,我已设置所有权限,并且已激活GPS和WLAN。
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
try {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
} catch(SecurityException e ) {
Log.d("GPS", "Security Exception: " + e.getLocalizedMessage());
}
}
if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
try {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
} catch(SecurityException e ) {
Log.d("GPS", "Security Exception: " + e.getLocalizedMessage());
}
}
if (locationManager.isProviderEnabled(LocationManager.PASSIVE_PROVIDER)) {
try {
locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, locationListener);
} catch(SecurityException e ) {
Log.d("GPS", "Security Exception: " + e.getLocalizedMessage());
}
}
locationListener
是LocationListener
接口的简单实现,只存储onLocationChanged(Location location)
提供的位置,并通过Log.d("GPS", location.getProvider()+" "+location.toString());
打印出来以进行调试。
如果手机很长一段时间没有使用GPS(我还没知道确切要经过多长时间),它将无法通过locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
提供位置(它会返回null
它不会打电话给我locationListener
。我等了大约30分钟,但没有更新。
另一方面,当我打开谷歌地图(例如在浏览器中)时,我会立即获得一个位置,当我打开我的应用程序时,我也会获得位置更新。
那么其他应用程序如何强制Android提供新位置?
任何帮助都将不胜感激。
答案 0 :(得分:0)
您可以通过条件选择最佳提供商。而不是如果条件使用下面的代码。查看更多详情https://blog.codecentric.de/en/2014/05/android-gps-positioning-location-strategies/
locationManager.requestLocationUpdates(getProviderName(), 0, 0, locationListener);
String getProviderName() {
LocationManager locationManager = (LocationManager) this
.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setPowerRequirement(Criteria.POWER_LOW); // Chose your desired power consumption level.
criteria.setAccuracy(Criteria.ACCURACY_FINE); // Choose your accuracy requirement.
criteria.setSpeedRequired(true); // Chose if speed for first location fix is required.
criteria.setAltitudeRequired(false); // Choose if you use altitude.
criteria.setBearingRequired(false); // Choose if you use bearing.
criteria.setCostAllowed(false); // Choose if this provider can waste money :-)
// Provide your criteria and flag enabledOnly that tells
// LocationManager only to return active providers.
return locationManager.getBestProvider(criteria, true);
}