geolocation - CodenameOne getCurrentLocation 方法之间有什么区别?

标签 geolocation codenameone

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

要获取设备位置,我知道我需要使用 LocationManager 的 getCurrentLocation 方法之一。但它们对我来说都很相似,所以我选了一个,但我不确定我选的是正确的,因为它在 Android (KitKat) 上运行得不太好(我稍后会解释)。

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

我还注意到,通常出现在 Android 状态栏中时钟附近的位置图标没有出现。为了让它出现,我注意到从 Google 启动 map 应用程序会出现位置图标,然后我的应用程序能够找到该设备。

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

`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 map 而不是我的应用程序时,屏幕上部的位置图标才会出现(就好像我的应用程序没有触发该位置一样)。 ?

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

    • 是否首选使用 LocationListener,尽管它可能仅在设备位置更改时触发?

预先感谢任何能让我更清楚地理解这一点的人,

编辑:遵循@ShaiAlmog的建议,为了使所有工作顺利进行,我必须这样做:

  • 不要使用上述 updateGeolocation() 方法
  • 创建实现 LocationListener 的 GeolocationListener 监听器,并在重写的 updateLocation 方法中执行我的操作(见下文)
  • 在主类的 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,该 API 试图提高 GPS 使用效率,并且仅在需要时启动它。

由于获取 GPS 信号可能需要几分钟的时间,并且可能不准确/不可用,因此对于临时请求来说,这是一种更简单的方法。但是,如果您使用监听器并保持其打开状态,那么位置应该会在您移动时慢慢地自行调整,感谢 Google Play 服务,它也不应该消耗那么多电池...

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

关于geolocation - CodenameOne getCurrentLocation 方法之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37332769/

相关文章:

elasticsearch - 如何在Elasticsearch中为具有纬度和经度的Geopoint编写映射?

ios - 地理围栏可以包含许多其他地理围栏吗

java - 显示位置并将相机置于其中心位置时出现问题

codenameone - Google Play 最近的审核通知 - APK 有一个突出的披露但披露不充分

codenameone - 我如何获得代号以使用 java.io.bufferedreader

ios - Foursquare field 搜索 API 返回超出半径的结果

javascript - 如何使用 Google Geocode API 和 PHP 获取用户的当前位置

java - codenameone 顺序套接字写/读

codenameone - CN1 MultiImage 大小与 Android dpi 资源文件夹的比较

java - 代号一 showNativePicker() 方法问题