Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android requestLocationUpdates不稳定_Android_Location - Fatal编程技术网

Android requestLocationUpdates不稳定

Android requestLocationUpdates不稳定,android,location,Android,Location,我在我的应用程序中使用了以下来自教程等的代码,以从GPS(或如果GPS未打开,则为网络)获取最佳位置定位,然后将其显示在文本字段中 crit = new Criteria(); context = Context.LOCATION_SERVICE; locationManager = (LocationManager) this.getSystemService(context); crit.setAccuracy(Criteria.ACCURACY_FINE); crit.setPowerRe

我在我的应用程序中使用了以下来自教程等的代码,以从GPS(或如果GPS未打开,则为网络)获取最佳位置定位,然后将其显示在文本字段中

crit = new Criteria();
context = Context.LOCATION_SERVICE;
locationManager = (LocationManager) this.getSystemService(context);
crit.setAccuracy(Criteria.ACCURACY_FINE);
crit.setPowerRequirement(Criteria.POWER_LOW);
crit.setAltitudeRequired(false);
crit.setBearingRequired(false);
crit.setSpeedRequired(false);
crit.setCostAllowed(false);
try {
    bestProvider = locationManager.getBestProvider(crit, true);
    loc = locationManager.getLastKnownLocation(bestProvider);
    locationManager.requestLocationUpdates(bestProvider, 0, 0,
            new GeoUpdateHandler());
} catch (java.lang.RuntimeException run) {
    Toast.makeText(getBaseContext(),
    "Waiting for location fix...", Toast.LENGTH_SHORT).show();
}
我的问题是在不同地点之间移动。我开始在诺福克使用我的应用程序,并确定位置。第二天,我在康沃尔(相距100英里),当我打开我的应用程序时(此时它应该已经被Android关闭/销毁),它仍然在向我显示诺福克的位置。我发现如果我退出我的应用程序并再次启动它,它就会选择新的位置。我可以很容易地做到这一点,但我的用户发现这是一个真正的痛苦

我的假设是,如果GPS/网络可用,那么我启动应用程序,从最后一个已知位置创建LOC,然后locationManager立即更新(应该立即更新LOC吗?)

很明显,这个更新没有发生


有人能告诉我我的代码是否愚蠢,或者建议一种更好的方法来确保我总是处理当前位置吗?谢谢道歉如果回答了,很难在所有关于位置和请求位置更新标签的帖子中找到。

在聊天中讨论后,我建议如下:


您需要调用
requestLocationUpdates()
,然后向用户显示一个类似“获取您的位置”的对话框。稍后,您应该会收到一个带有最新位置的回调
onLocationChanged()
。此时,您可以关闭该对话框并更新文本字段以及您希望向用户显示的任何内容。您还应该在获得最新位置后调用
removeUpdates()
,这样您就不会耗尽用户的电池。

您是否绝对知道移动位置后,您的应用程序实际上会重新启动?您可以查看日志以确定。此外,获得GPS定位可能需要一些时间。除非有另一个应用程序经常轮询GPS更新,否则您将无法立即获得更新。David-我假设该应用程序已关闭,因为自上次使用以来已超过24小时。我没有检查logcat,因为这是在现场电话上,这比我习惯的要复杂一些。你对即时轮询和更新的评论听起来不错,但我想知道是否有任何方法可以通知用户,这样他们就不会使用错误的位置,并且可以期待很快更新?这都有点困难,因为有很多变量和条件,等等。你可以试着用
location.getTime()
检查你得到的位置的时间戳,看看它是否“过时”。这可能有助于基于GPS的定位(我知道这对基于网络的定位没有帮助),我希望/需要用户能够使用GPS或网络。将继续思考。谢谢你的评论,很有帮助。我想知道是否拉bestProvider=locationManager….&loc=locationManager.getLastKnownLocation。。。退出try/catch并将try/catch调整为“boolean b=locationManager.requestLocationUpdates…”,使用相同的catch将调用“Waiting for fix…”消息?您认为会引发什么异常?getLastKnownLocation()和requestLocationUpdates()都不会因为没有当前数据而引发异常。
public class GeoUpdateHandler implements LocationListener {
  public void onLocationChanged(Location location) {
    loc = location;
  }
  public void onProviderDisabled(String provider) { }
  public void onProviderEnabled(String provider) {  }
  public void onStatusChanged(String provider, int status, Bundle extras) { }
}