即使地图应用显示正确的位置,位置服务getBestProvider调用也返回null。 FINE_LOCATION和COARSE_LOCATION的权限位于清单中。
public static Location getLocation(Context context) {
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
Location myLocation = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));
return myLocation;
}
任何帮助都会非常感激,因为这是我第一次使用位置服务。提前谢谢。
答案 0 :(得分:4)
尝试使用locationmanager.getBestProvider()的这个instread,看它现在是否有效:
String locationProvider = LocationManager.NETWORK_PROVIDER;
Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);
此外,如果你将false传递给getBestProvider(),它将返回最好的Provider,无论它是否打开,它只取决于你的Criteria,所以它可能会返回null,例如,如果你没有手动启用GPS。
答案 1 :(得分:4)
无论您使用GPS,NETWORK或哪种提供商,所有提供的工作都基于从本地(设备上)缓存获取位置的相同原则。
试试这个实验。更改您的physical
位置(移动,距您现在大约200米)并加载谷歌地图,您的应用程序也会突然返回正确的坐标。这是因为谷歌地图知道如何触发本地缓存更新。我(幸运的是)找到了触发缓存更新的方法。
在你的getLastKnownLocation和魔法发生之前调用它。
HomeScreen.getLocationManager().requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onLocationChanged(final Location location) {
}
});
或使用LocationClient。用于位置更新的新API。
答案 2 :(得分:0)
我建议您使用新的位置api,您可以在google_play_services_lib(https://github.com/chrulri/google-play-services_lib)中找到它。只需将其作为android库项目添加到您的项目中。这个库的最大优点是你不必处理GPS和NETWORK的东西,它会自动决定使用哪一个。
在这里阅读更多相关信息:
https://developer.android.com/google/play-services/location.html