1

关于 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。如果用户在我们得到修复之前单击取消,那么我应该取消注册我的接收器并关闭对话框。当然我明天会试试这个,但是非常欢迎任何想法或建议甚至评论!

4

2 回答 2

0

由于 Luis 回答了我的第二个问题(基本上是“何时?”取消请求),我将把答案添加到我的第一个和主要问题(虽然更简单):是的,可以在 requestSingleUpdate 方法之后取消 GPS 搜索如果您只是取消注册侦听器并删除更新,请致电。我在取消按钮的 onClick 方法中执行此操作。还有一件事要记住:如果 GPS 得到修复并返回位置,则调用 ProgressDialog 的 cancel() 方法。

于 2012-12-17T08:38:15.217 回答
0

我建议您使用ProgressDialog来通知正在等待修复的用户。您也可以设置消息并向Cancel其添加按钮。请参阅此链接:如何在进度对话框中设置取消按钮?

如果用户取消ProgressDialod,那么您将启动屏幕并请求手动输入。

问候。

于 2012-12-16T22:22:47.850 回答