Android - 可靠地获取当前位置

noa*_*oah 8 gps android geolocation

我的应用程序在特定时间检查用户是否在指定位置.我使用警报管理器启动进行此调用的服务:

locationManager.requestLocationUpdates(bestProvider, 0, 0, listener);
Run Code Online (Sandbox Code Playgroud)

还检查:

 locationManager.getLastKnownLocation(bestProvider);
Run Code Online (Sandbox Code Playgroud)

但是我在真实设备上运行时遇到了问题.一方面,getLastKnownLocation最有可能是最后的地方的GPS是上,这可以在任何地方(即,它可以从用户的当前位置英里).所以我只是等待requestLocationUpdates回调,如果他们在两分钟内没有回复,请删除听众并放弃,对吧?

错了,因为如果用户的位置已经是稳定的(即,他们使用GPS最近并没有移动),然后我的听众将永远不会被调用,因为位置不会改变.但GPS将一直运行,直到我的听众被移除,耗尽电池......

获取当前位置的正确方法是什么,而不会误认为当前位置的旧位置?我不介意等几分钟.

编辑:有可能我错误的听众没有被调用,它可能只需要比我想象的更长一点...很难说.我还是很欣赏一个明确的答案.

Fed*_*dor 4

代码可能是这样的:

public class MyLocation {
    Timer timer1;
    LocationManager lm;

    public boolean getLocation(Context context)
    {
        lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
        timer1=new Timer();
        timer1.schedule(new GetLastLocation(), 20000);
        return true;
    }

    LocationListener locationListenerGps = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            lm.removeUpdates(this);
            //use location as it is the latest value
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    class GetLastLocation extends TimerTask {
        @Override
        public void run() {
             lm.removeUpdates(locationListenerGps);
             Location location=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
             //use location as we have not received the new value from listener
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我们启动监听器并等待更新一段时间(在我的示例中为 20 秒)。如果我们在此期间收到更新,我们就会使用它。如果我们在此期间没有收到更新,我们将使用 getLastKnownLocation 值并停止侦听器。

您可以在此处查看我的完整代码在 Android 上获取用户当前位置的最简单、最可靠的方法是什么?

编辑(由提问者):这是大部分答案,但我的最终解决方案使用处理程序而不是计时器。