CodenameOne getCurrentLocation 方法之间有什么区别?
What are the differences between CodenameOne getCurrentLocation methods?
我正在为 Android 和 iOS 构建一个应用程序,它可以拍照、检索设备位置并将包发送到服务器进行处理。
要获取设备位置,我知道我需要使用 LocationManager 的 getCurrentLocation 方法之一。但它们对我来说都很相似,所以我选择了一个,但我不确定我是否选择了正确的,因为它在 Android (KitKat) 上效果不佳(我稍后会解释)。
事实上,我遇到过与最近[此处] () 报道的相同的怪事,甚至更糟。例如连接到 home/office Wifi,位置(虽然在室内)是准确的。我知道该设备的结果基于网络。但是当我在 5 公里(和 40 分钟)开阔的天空下并使用 getCurrentLocation 或 getCurrentLocationAsync 或什至超时执行位置测试时,设备输出我的 home/office 过去的位置,精度为 50 米。
我还注意到 Android 时钟附近状态栏中正常出现的位置图标没有出现。为了使其显示,我注意到从 Google 启动地图应用程序会出现位置图标,然后我的应用程序能够找到设备。
这是我用来获取位置的最后一种方法:
`public static final void updateGeolocation (){
Location location = null;
try {
location = LocationManager.getLocationManager().getCurrentLocation();
setLocation(location);
setGeolocationAccuracy(location.getAccuracy() > 0.0f ? location.getAccuracy() : DEFAULT_GEOLOCATION_ACCURACY);
} catch (IOException e) {
setLocation(null);
setGeolocationAccuracy(DEFAULT_GEOLOCATION_ACCURACY);
}
}`
现在这是我使用 timerTask 更新位置的方法:
// On lance la mise à jour périodique de la position de l'appareil
// la tache se lance en dehors de l'EDT
ParametresGeneraux.setCheckTimer(new Timer());
ParametresGeneraux.setCheckTask(new TimerTask(){
@Override
public void run() {
ParametresGeneraux.updateGeolocation();
}
});
ParametresGeneraux.getCheckTimer().schedule(ParametresGeneraux.getCheckTask(), 0, ParametresGeneraux.GEOLOCATION_CHECK_INTERVAL);
注意:关于构建提示,我用提示 ios.locationUsageDescription 解释了我对 GPS 的需求
我禁用了 android.captureRecord 提示,因为我确实需要它并且不想让用户怀疑我为什么需要捕获记录。
所以我的问题是:
我是否以正确的方式使用 getCurrentLocation,这样我就可以责怪我的 phone 的硬件,还是我使用错误?
为什么只有在我启动 Google 地图而不是我的应用程序时才会出现屏幕上部的位置图标(好像我的应用程序没有触发位置)。 ?
如果我不使用超时并且位置需要 10 分钟才能到达怎么办?会发生什么 ?如果我将超时设置为 10 秒并且位置在 10 分钟后出现(例如我在隧道中),会有什么区别?
是否最好使用 LocationListener,尽管它可能仅在设备位置更改时触发?
提前感谢任何能让我更清楚这一点的人,
编辑:按照@ShaiAlmog 的建议使所有工作顺利进行我必须:
- 不要使用上述 updateGeolocation() 方法
- 创建我的实现 LocationListener 的 GeolocationListener 侦听器并在覆盖的 updateLocation 方法中执行我的操作(见下文)
- 在主 class' init 方法中将 LocationListener 设置为我的 GeolocationListener
现在更新的位置可用并且位置图标按预期显示。
我的 GeolocationListener 就像下面的代码一样简单:
public class GeolocationListener implements LocationListener{
@Override
public void providerStateChanged(int newState) {
}
/**
* Met à jour les valeur de la position et la précision de la géolocalisation si le service de géoloc est dispo. Sinon met à jour les valeurs avec null pour la position
* et DEFAULT_GEOLOCATION_ACCURACY pour la précision
*/
@Override
public void locationUpdated(Location location) {
// Par défaut
ParametresGeneraux.setLocation(null);
ParametresGeneraux.setGeolocationAccuracy(ParametresGeneraux.DEFAULT_GEOLOCATION_ACCURACY);
/*On met à jour la position et la précision
*/
if (location != null && (location.getStatus() == LocationManager.AVAILABLE)){
ParametresGeneraux.setLocation(location);
if ( location.getAccuracy() > 0.0f ) {
ParametresGeneraux.setGeolocationAccuracy(location.getAccuracy());
}
} // fin de la mise à jour de la position
}
}
此致
如果您需要持续监控位置,您需要使用 setLocationListener,它会在您的位置发生变化时通知您。我们在 Google Play 中使用混合位置 API,它试图在 GPS 使用方面更高效,并且只在需要时启动它。
由于获取 GPS 信号可能需要几分钟时间,而且可能 inaccurate/unavailable 对于临时请求,这是一种更简单的方法。但是,如果您使用侦听器并将其保持打开状态,则该位置应该会随着您的移动而缓慢地自我完善,多亏了 Google Play 服务,它也不应该消耗那么多电量...
使用此方法时不应使用 getCurrentLocation
或 getCurrentLocationSync
。
我正在为 Android 和 iOS 构建一个应用程序,它可以拍照、检索设备位置并将包发送到服务器进行处理。
要获取设备位置,我知道我需要使用 LocationManager 的 getCurrentLocation 方法之一。但它们对我来说都很相似,所以我选择了一个,但我不确定我是否选择了正确的,因为它在 Android (KitKat) 上效果不佳(我稍后会解释)。
事实上,我遇到过与最近[此处] (
我还注意到 Android 时钟附近状态栏中正常出现的位置图标没有出现。为了使其显示,我注意到从 Google 启动地图应用程序会出现位置图标,然后我的应用程序能够找到设备。
这是我用来获取位置的最后一种方法:
`public static final void updateGeolocation (){
Location location = null;
try {
location = LocationManager.getLocationManager().getCurrentLocation();
setLocation(location);
setGeolocationAccuracy(location.getAccuracy() > 0.0f ? location.getAccuracy() : DEFAULT_GEOLOCATION_ACCURACY);
} catch (IOException e) {
setLocation(null);
setGeolocationAccuracy(DEFAULT_GEOLOCATION_ACCURACY);
}
}`
现在这是我使用 timerTask 更新位置的方法:
// On lance la mise à jour périodique de la position de l'appareil
// la tache se lance en dehors de l'EDT
ParametresGeneraux.setCheckTimer(new Timer());
ParametresGeneraux.setCheckTask(new TimerTask(){
@Override
public void run() {
ParametresGeneraux.updateGeolocation();
}
});
ParametresGeneraux.getCheckTimer().schedule(ParametresGeneraux.getCheckTask(), 0, ParametresGeneraux.GEOLOCATION_CHECK_INTERVAL);
注意:关于构建提示,我用提示 ios.locationUsageDescription 解释了我对 GPS 的需求 我禁用了 android.captureRecord 提示,因为我确实需要它并且不想让用户怀疑我为什么需要捕获记录。
所以我的问题是:
我是否以正确的方式使用 getCurrentLocation,这样我就可以责怪我的 phone 的硬件,还是我使用错误?
为什么只有在我启动 Google 地图而不是我的应用程序时才会出现屏幕上部的位置图标(好像我的应用程序没有触发位置)。 ?
如果我不使用超时并且位置需要 10 分钟才能到达怎么办?会发生什么 ?如果我将超时设置为 10 秒并且位置在 10 分钟后出现(例如我在隧道中),会有什么区别?
是否最好使用 LocationListener,尽管它可能仅在设备位置更改时触发?
提前感谢任何能让我更清楚这一点的人,
编辑:按照@ShaiAlmog 的建议使所有工作顺利进行我必须:
- 不要使用上述 updateGeolocation() 方法
- 创建我的实现 LocationListener 的 GeolocationListener 侦听器并在覆盖的 updateLocation 方法中执行我的操作(见下文)
- 在主 class' init 方法中将 LocationListener 设置为我的 GeolocationListener
现在更新的位置可用并且位置图标按预期显示。
我的 GeolocationListener 就像下面的代码一样简单:
public class GeolocationListener implements LocationListener{
@Override
public void providerStateChanged(int newState) {
}
/**
* Met à jour les valeur de la position et la précision de la géolocalisation si le service de géoloc est dispo. Sinon met à jour les valeurs avec null pour la position
* et DEFAULT_GEOLOCATION_ACCURACY pour la précision
*/
@Override
public void locationUpdated(Location location) {
// Par défaut
ParametresGeneraux.setLocation(null);
ParametresGeneraux.setGeolocationAccuracy(ParametresGeneraux.DEFAULT_GEOLOCATION_ACCURACY);
/*On met à jour la position et la précision
*/
if (location != null && (location.getStatus() == LocationManager.AVAILABLE)){
ParametresGeneraux.setLocation(location);
if ( location.getAccuracy() > 0.0f ) {
ParametresGeneraux.setGeolocationAccuracy(location.getAccuracy());
}
} // fin de la mise à jour de la position
}
}
此致
如果您需要持续监控位置,您需要使用 setLocationListener,它会在您的位置发生变化时通知您。我们在 Google Play 中使用混合位置 API,它试图在 GPS 使用方面更高效,并且只在需要时启动它。
由于获取 GPS 信号可能需要几分钟时间,而且可能 inaccurate/unavailable 对于临时请求,这是一种更简单的方法。但是,如果您使用侦听器并将其保持打开状态,则该位置应该会随着您的移动而缓慢地自我完善,多亏了 Google Play 服务,它也不应该消耗那么多电量...
使用此方法时不应使用 getCurrentLocation
或 getCurrentLocationSync
。