我在我正在开发的Android应用程序中使用位置服务。经过一些研究,我发现getLastKnownLocation()
是获取用户最近位置的最快方式。我没有问题它有点过时,因为我的应用程序的模块不需要用户的当前位置。这个解决方案对我来说很好,因为我不需要在特定时刻确切地需要用户的确切位置。
但是,getLastKnownLocation
的明显问题是,如果设备没有存储最近的位置或者您最近重新启动了设备,则必须返回null
。
我的问题是,当getLastKnownLocation
为null
时该怎么做?
这就是我的想法:
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
String bestProvider = lm.getBestProvider(criteria, false);
Location l = lm.getLastKnownLocation(bestProvider);
if(l != null) {
Log.d("Lat", String.valueOf(l.getLatitude()));
Log.d("Lng", String.valueOf(l.getLongitude()));
}
else {
PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(),
PendingIntent.FLAG_UPDATE_CURRENT);
lm.requestSingleUpdate(bestProvider, pi);
Location ln = lm.getLastKnownLocation(lm.getBestProvider(criteria, false));
// Still returns null
Log.d("NewLat", String.valueOf(ln.getLatitude()));
Log.d("NewLng", String.valueOf(ln.getLongitude()));
}
那么,reqyestSingleUpdate
的呼叫是否应该存储最新的位置数据?但它似乎并没有起作用。
我哪里错了?你怎么解决这个问题?
答案 0 :(得分:0)
所以在你的应用程序中插入他的类,然后在你的活动中使用它就像这样
mMyLocHelper = new MyLocationHelper();
// An object with callback that will be called after location was found
LocationResult locationResult = new LocationResult() {
@Override
public void gotLocation(Location location) {
if (location != null) {
mUserLocation = location;
// Here my action after location is known (on UI thread!)
runOnUiThread(new Runnable() {
@Override
public void run() {
myAction();
}
});
}
else {
// No location was found
runOnUiThread(new Runnable() {
@Override
public void run() {
informUser();
}
});
}
}
};
// We state, that we can wait for 20 seconds for the location, and start the process
if (mMyLocHelper.getLocation(this, locationResult, 20)) {
mLocationEnabled = true;
}
else {
mLocationEnabled = false;
// Localization is turned off. Inform user
informUser();
}
无法保证您将获得位置。
答案 1 :(得分:0)
1)您无法避免程序中出现“位置未知”状态。在某个时刻,这个位置确实是未知的。
2)您 getBestProvider(),但您可以使用其他提供商一段时间。无法保证第二个提供商能够正常工作(手机中可能没有SIM卡)。
3)您可以在首选项中存储最后的已知位置,请参阅 Context.getSharedPreferences()。
4)你可以开始“在北极”(北极坐标: - )。
然而,您的应用程序可能永远不会收到位置数据:它可能会在建筑物中启动,其中有太多金属供GPS工作,并且手机插槽中没有SIM卡(如果 < / em>手机而不是平板电脑。