CodenameOne getCurrentLocation方法有什么区别?

时间:2016-05-19 19:50:43

标签: geolocation codenameone

我正在为Android和iOS构建一个应用程序,它可以拍照,检索设备位置并将包发送到服务器进行处理。

要获取设备位置,我知道我需要使用一个LocationManager的getCurrentLocation方法。但它们看起来都很相似,所以我选了一个,但我不确定我选择了正确的,因为它在Android(KitKat)上效果不好(我将在后面解释)。

事实上,我经历了与最近报道的[这里](How to make an immediate reading location using GPS)相同的奇怪现象,甚至更糟。例如连接到家庭/办公室Wifi的位置(虽然室内)是准确的。我知道该设备的结果基于网络。但是当我在开阔的天空5公里(和40分钟)以及使用getCurrentLocation或getCurrentLocationAsync执行位置测试或甚至超时时,设备输出我的家庭/办公室过去位置,精度为例如50米。

另外,我注意到,时钟附近的Android状态栏中正常显示的位置图标不会出现。为了显示它,我注意到从谷歌启动地图应用程序使得位置图标出现,然后我的应用程序能够找到该设备。

这是我用来获取位置的最后一种方法:

`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以便我可以责怪我的手机硬件或我使用它错了?

  • 为什么屏幕上方的位置图标只有在我启动Google地图而不是我的应用时才显示(就好像我的应用没有触发该位置)。 ?

    • 如果我不使用超时并且位置需要10分钟到达,该怎么办?会发生什么 ?如果我将超时设置为10秒并且位置在10分钟后出现(例如我在隧道中)会有什么不同?

    • 是否首选使用LocationListener,但它只能在设备位置发生变化时触发?

提前感谢任何能让我更清楚的人,

编辑:按照@ShaiAlmog的建议,我必须顺利完成所有工作:

  • 不使用上述updateGeolocation()方法
  • 创建我的GeolocationListener侦听器,该侦听器实现LocationListener并在重写updateLocation方法中执行我的操作(参见下文)
  • 将LocationListener设置为主类'init method
  • 中的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
}

}

此致

1 个答案:

答案 0 :(得分:2)

如果您需要不断监控位置,则需要使用setLocationListener,以便在您的位置发生变化时通知您。我们在Google Play中使用混合位置API,尝试在GPS使用方面更高效,并且只在需要时启动它。

由于获取GPS信号可能需要几分钟而且可能不准确/不可用,因此这是一种更简单的adhoc请求方式。但是,如果您使用收听者并保持打开状态,那么当您移动时,该位置应该会慢慢完善自己,这要归功于Google Play服务,它不应该使用那么多电池......

使用此方法时,您不应该使用getCurrentLocationgetCurrentLocationSync