关于LocationManager和获取用户位置的不同方法存在很多问题。然而,他们中的大多数都集中在准确性上,因为不同的要求,我的方法有点不同。 我需要的是约。用户的GPS位置但尽可能快(但只有在用户点击按钮后)和一些EditText框应填充坐标。问题是,在大多数情况下,数据传输将在设备上禁用,因此网络位置将不可用。我必须坚持使用GPS,这在设计上并不快。所以这就是我的工作:
在按钮上单击我调用我的主Activity的getGPS()方法,因为我不关心准确性(我只需要得到一个大约坐标)我正在检查最后的已知位置,评论代码是不言自明的
public void getGPS(View view) {
// load all available Location providers
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
List<String> providers = locationManager.getProviders(false);
// determine the last known location within 2 hours available from cache
Location myLocation = null;
Date now = new Date();
long time = now.getTime();
long timeDiff = LOCATION_MAX_AGE;
for (int i=providers.size()-1; i>=0; i--) {
Location l = locationManager.getLastKnownLocation(providers.get(i));
if (l != null) {
long t = l.getTime();
if (time - t < timeDiff) {
myLocation = l;
time = t;
timeDiff = time - t;
}
}
}
// if failed to get cached location or if it is older than 2 hours, request GPS position
if (myLocation == null) {
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
pIntent = PendingIntent.getBroadcast(context,
0,
new Intent(SINGLE_UPDATE_ACTION),
PendingIntent.FLAG_UPDATE_CURRENT);
IntentFilter iFilter = new IntentFilter(SINGLE_UPDATE_ACTION);
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// when received an answer from the LocationManager
Location gpsLocation = (Location) intent.getExtras().get(LocationManager.KEY_LOCATION_CHANGED);
fillLocation(gpsLocation);
Log.d(TAG, "Received GPS location: " + gpsLocation.getLatitude() + ", " + gpsLocation.getLongitude() + " Time: " + gpsLocation.getTime());
locationManager.removeUpdates(pIntent);
unregisterReceiver(receiver);
}
};
context.registerReceiver(receiver, iFilter);
// I'm absolutely fine with getting the first available GPS position and that's enough to me.
locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, pIntent);
// if GPS is disabled in settings allow user to enable it
} else {
showGPSDisabledAlertToUser();
}
} else {
// if fresh enough lastKnownLocation is found
fillLocation(myLocation);
}
}
一切都很好,在大多数情况下,有一个lastKnownLocation,并且在用户点击按钮后立即出现坐标。但是当我不那么幸运时,会出现GPS图标,问题出现了。由于没有可用的数据连接,GPS修复需要比平时更长的时间。在此期间,活动仍然可访问,用户并不真正意识到坐标即将出现。另一个问题是当用户无法在合理的时间内获得GPS定位时,他应该能够取消该请求。
所以,我的问题是:这里最好的方法是什么? 更具体地说:是否有可能(以及如何?)向用户显示类似等待对话的内容(例如“获取GPS位置......”)和一个“取消”按钮,这可能会中断请求并将用户带回主活动,停止任何GPS活动并显示祝酒,要求用户手动输入坐标?
很抱歉,如果这很容易,我刚刚开始学习Android的开发,我的应用程序几乎已经完成,除了这件事。我非常努力地搜索,但遗憾的是没有找到任何东西。非常感谢提前!
编辑:在我发布问题半小时后,我意识到我可能已经知道了答案。我可能需要打开一个带有等待光标的对话框来阻止UI,显示我的消息和取消按钮并从那里请求LocationManager。如果用户在我们获得修复之前单击取消,那么我应取消注册我的接收器并关闭该对话框。 我明天会尝试这个,但是非常欢迎任何想法或建议甚至评论!答案 0 :(得分:0)
我建议您使用ProgressDialog通知用户正在等待修复。您也可以设置消息并为其添加Cancel
按钮。请看这个链接:How to set cancel button in Progress Dialog?
如果用户取消ProgressDialod
,那么您将启动屏幕并请求手动输入。
问候。
答案 1 :(得分:0)
由于路易斯回答了我的第二个问题(基本上是“什么时候?”取消请求)我会将答案添加到我的第一个和主要问题(虽然更容易):是的,有可能取消之后的GPS搜索如果您只是取消注册侦听器并删除更新,则调用requestSingleUpdate方法。我在取消按钮的onClick方法中执行此操作。还有一点需要记住:如果GPS得到修复并返回位置,则将cancel()方法调用ProgressDialog。