如何(以及何时?)取消LocationManager.requestSingleUpdate,如果可能的话?

时间:2012-12-16 21:11:51

标签: android gps locationmanager

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

2 个答案:

答案 0 :(得分:0)

我建议您使用ProgressDialog通知用户正在等待修复。您也可以设置消息并为其添加Cancel按钮。请看这个链接:How to set cancel button in Progress Dialog?

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

问候。

答案 1 :(得分:0)

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