我的位置为:
LocationManager locationManager;
GeoPoint p;
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean gps_enabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (gps_enabled) {
Location location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
但是,gps_enabled=true
但是location = null。
为什么找不到我的位置?你能帮助我吗?
如果我通过NETWORK_PROVIDER得到了。
答案 0 :(得分:2)
嗯,有很多事情。 GPS可能来自所谓的“冷启动”,它不知道它在哪里。在这些情况下,最后一个已知位置为空。您也可能位于没有信号获取位置修复的位置。它也可能是一个蹩脚的GPS或蹩脚的GPS驱动程序(咳嗽三星咳嗽)。这些都不准确。
首先,我将从这个文档开始。 Location Acquisition Strategies
接下来,我们来评估逻辑。是的,GPS已启用。但是,在此上下文中,enabled表示启用了具有精细位置权限的应用程序。启用并不意味着它当前处于活动状态并获取位置。但是有好消息!您可以创建一个监听器或订阅位置更新。
正如其他人提到的那样,请确保您在清单中设置了权限。我认为你这样做了,否则你的应用可能会因getLastKnownLocation()
电话上的权限问题而崩溃并被烧毁。
然后,要接收位置更新,请查看LocationListener课程。通过实施此界面,您可以使用locationManager.requestLocationUpdates()
从GPS注册位置更新。
使用你的代码(我假设一些事情,比如它在一个活动中,并且在UI线程上调用所描述的方法):
public class MyActivity extends Activity implements LocationListener {
// The rest of the interface is not really relevant for the example
public void onProviderDisabled(String provider) { }
public void onProviderEnabled(String provider) { }
public void onStatusChanged(String provider, int status, Bundle extras) { }
// When a new location is available from the Location Provider,
// this method will be called.
public void onLocationChanged(Location location) {
// You should do whatever it was that required the location
doStuffWithLocation(location);
// AND for the sake of your users' battery stop listening for updates
(LocationManager) getSystemService(LOCATION_SERVICE).removeUpdates(this);
// and cleanup any UI views that were informing of the delay
dismissLoadingSpinner();
}
// Then in whatever code you have
public void methodA() {
LocationManager locationManager;
GeoPoint p;
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (gps_enabled) {
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location == null) {
// When it is null, register for update notifications.
// run this on the UI Thread if need be
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
// Since this might take some time you should give the user a sense
// that progress is being made, i.e. an indeterminate ProgressBar
showLoadingSpinner();
} else {
// Otherwise just use the location as you were about to
doStuffWithLocation(location);
}
}
...
这应该按照您的预期运行您的代码,然后在GPS没有位置的情况下,您将其旋转并等到您获得位置。一旦发生这种情况,您可以将其关闭并按照您的计划使用它。这是一种天真的方法,但你应该能够将它作为一个简单的基础。真正的解决方案应考虑到无法获得位置的情况,在位置提供者不可用时处理案例或在等待位置时变得不可用的情况,并验证位置的完整性。
答案 1 :(得分:1)
您是否在清单中添加了这些权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
编辑:
浏览this link。它提供了不同的策略来查找位置。
答案 2 :(得分:1)
你给了权限..
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
答案 3 :(得分:1)
方法getLastKnownLocation()
只返回GPS获取的最后一个位置,并将其打开。例如,如果您重新安排手机,则会清理缓存并且GPS不会有任何缓存位置返回,直到您启动它并让它在一个位置获取。
答案 4 :(得分:1)
使用代码:
// Get the location manager
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
// Initialize the location fields
if (location != null) {
System.out.println("Provider " + provider + " has been selected.");
double lat = (double) (location.getLatitude());
double lng = (double) (location.getLongitude());
Log.i(TAG, "Lattitude:" +lat);
Log.i(TAG, "Longitude:" +lng);
} else {
System.out.println("Location not avilable");
}
}
答案 5 :(得分:1)
你可以找到我已回答类似问题的解决方案。希望这会帮助你。 https://stackoverflow.com/a/12911930/1730706