在Android上同步获取最后已知位置

3
使用LocationClient(v2 API)以同步方式获取Android上的上次已知位置的“正确”方法是什么?
更新 这是我想到的最好方法(它不是同步的,但克服了每次需要上次已知位置时处理connect()和onConnected()的负担):
public enum SystemServicesNew implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener {

    INSTANCE;

    private LocationClient mLocationClient;
    private Location mLastKnownLocation;

    static {
        INSTANCE.mLocationClient = new LocationClient(MyApp.getAppContext(), INSTANCE, INSTANCE);
        INSTANCE.mLastKnownLocation = new Location("");
        INSTANCE.mLastKnownLocation.setLatitude(0);
        INSTANCE.mLastKnownLocation.setLongitude(0);
        INSTANCE.getLastKnownLocation(); // fire it already so subsequent calls get the real location
    }

    public Location getLastKnownLocation()
    {
        if(!mLocationClient.isConnected()) {
            mLocationClient.connect();
            return mLastKnownLocation;
        }
        mLastKnownLocation = mLocationClient.getLastLocation();
        return mLastKnownLocation;
    }

    @Override
    public void onConnected(Bundle bundle) {
        Toast.makeText(MyApp.getAppContext(), "LocationClient:Connected", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDisconnected() {
        Toast.makeText(MyApp.getAppContext(), "LocationClient:Disconnected", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Toast.makeText(MyApp.getAppContext(), connectionResult.toString(), Toast.LENGTH_SHORT).show();
    }
}

我的Java技能……还不够发展……有什么改进建议吗?

1个回答

0
一个合法的方法是使用LocationClient的getLastLocation()。如果你想以同步方式完成它,你应该记住它不会是一个精确的位置,在极少数情况下甚至可能无法使用。请查看下面的文档:
public Location getLastLocation ()

返回当前可用的最佳最新位置。

如果位置不可用(这应该非常罕见),则将返回 null。将返回可用的最佳精度,同时尊重位置权限。

此方法提供了一种简化的获取位置的方式。它特别适用于不需要准确位置且不想维护额外位置更新逻辑的应用程序。


3
是的,问题在于必须在调用getLastLocation()之前调用connect()并接收onConnected事件。我想将所有这些内容封装在同步方法中,但是同步部分让我很难处理。 - Sorin Comanescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接