关于 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 定位需要比平时更长的时间。在此期间,Activity 仍然可以访问,用户并没有真正意识到坐标即将出现。另一个问题是当用户无法在合理的时间内获得 GPS 定位时,他应该能够取消请求。
所以,我的问题是:这里最好的方法是什么?更具体地说:是否有可能(以及如何?)向用户显示诸如等待对话框之类的内容(例如“正在获取 GPS 位置...”)和一个按钮“取消”,这可能会中断请求并使用户返回主界面活动,停止任何 GPS 活动并显示祝酒词,要求用户手动输入坐标?
抱歉,如果这很简单,我刚刚开始学习为 Android 开发,我的应用程序几乎完成了,除了这件事。我非常努力地搜索,不幸的是没有找到任何东西。提前谢谢了!
编辑:在我发布问题半小时后,我意识到我可能已经知道答案了。我可能需要打开一个带有等待光标的对话框来阻止 UI,显示我的消息和一个取消按钮并从那里请求 LocationManager。如果用户在我们得到修复之前单击取消,那么我应该取消注册我的接收器并关闭对话框。当然我明天会试试这个,但是非常欢迎任何想法或建议甚至评论!