【问题标题】:Android network location (time to get update)Android 网络位置(获取更新的时间)
【发布时间】:2011-10-24 23:37:00
【问题描述】:

当我使用网络提供商在 Android 上跟踪用户位置时,当手机处于睡眠(挂起)模式时,我需要很长时间才能获得更新。这篇文章中的相同问题: Android network location takes hours to update location

我正在使用 AlarmManager 来触发使用 PARTIAL_WAKE_LOCK 启动服务的意图,等到从侦听器接收到位置更新并自行停止(释放唤醒锁)。

使用 GPS 提供程序可以完美运行。所有权限都可以(精细/粗略位置、唤醒锁定)。

有什么想法吗?谢谢!

编辑 此问题引起的问题:http://code.google.com/p/android/issues/detail?id=10931

【问题讨论】:

    标签: android networking location


    【解决方案1】:

    您是否有任何逻辑来验证新位置是否更适合显示?可能在遇到某些条件之前,旧位置始终被视为更好的位置。试试下面的 sn-p :

    private static final int TWO_MINUTES = 1000 * 60 * 2;
    
    /** Determines whether one Location reading is better than the current Location fix
      * @param location  The new Location that you want to evaluate
      * @param currentBestLocation  The current Location fix, to which you want to compare the new one
      */
    protected boolean isBetterLocation(Location location, Location currentBestLocation) {
        if (currentBestLocation == null) {
            // A new location is always better than no location
            return true;
        }
    
        // Check whether the new location fix is newer or older
        long timeDelta = location.getTime() - currentBestLocation.getTime();
        boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
        boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
        boolean isNewer = timeDelta > 0;
    
        // If it's been more than two minutes since the current location, use the new location
        // because the user has likely moved
        if (isSignificantlyNewer) {
            return true;
        // If the new location is more than two minutes older, it must be worse
        } else if (isSignificantlyOlder) {
            return false;
        }
    
        // Check whether the new location fix is more or less accurate
        int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
        boolean isLessAccurate = accuracyDelta > 0;
        boolean isMoreAccurate = accuracyDelta < 0;
        boolean isSignificantlyLessAccurate = accuracyDelta > 200;
    
        // Check if the old and new location are from the same provider
        boolean isFromSameProvider = isSameProvider(location.getProvider(),
                currentBestLocation.getProvider());
    
        // Determine location quality using a combination of timeliness and accuracy
        if (isMoreAccurate) {
            return true;
        } else if (isNewer && !isLessAccurate) {
            return true;
        } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
            return true;
        }
        return false;
    }
    
    /** Checks whether two providers are the same */
    private boolean isSameProvider(String provider1, String provider2) {
        if (provider1 == null) {
          return provider2 == null;
        }
        return provider1.equals(provider2);
    }
    

    【讨论】:

    【解决方案2】:

    问题在于网络提供商非常不准确。 (大约在 3 公里范围内)因此位置更新缓慢,您必须从一个基站移动到另一个基站。

    编辑:原来,这是a known issue

    【讨论】:

    • 搬到离我家 20 公里的地方(经过各种不同的牢房)我没有得到任何更新。
    • 嗯,这很奇怪,问题是网络提供商代码不是开源的,所以我不知道它是如何工作的。
    • 这个问题引起的问题:code.google.com/p/android/issues/detail?id=10931
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多