1

我有以下简单的课程,这是我的主要活动。我基本上是按照 Android 文档中的这个逐字记录的。我正在通过 Android Studio 从我的手机运行它。我遇到的问题是我绝对不会从这个设置中得到一个合法的位置。location对象始终为空。实际上,我希望类似于浏览器通过navigator.geolocation.

我的设置方式有什么奇怪的吗?如果没有,我如何强制一个位置脱离 Fused Location Provider API?

public class MyActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
    private Location location;
    private GoogleApiClient mGoogleApiClient;
    private static LocationRequest locationRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        // Create an instance of GoogleAPIClient.
        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
        }
    }

    @Override
    protected void onStart() {
        mGoogleApiClient.connect();
        super.onStart();
    }

    @Override
    protected void onStop() {
        mGoogleApiClient.disconnect();
        super.onStop();
    }

    private void requestLocationUpdates() {
        locationRequest = new LocationRequest();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(1000);
        locationRequest.setFastestInterval(500);
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        requestLocationUpdates();
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,  locationRequest, this);
        location = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
        if (location != null) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();
        }
    }

    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();
        }
    }

    @Override
    public void onConnectionSuspended(int i) {}

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {}
}
4

1 回答 1

0

高精度意味着它需要GPS。如果您实际上无法联系 GPS 卫星(例如,您在没有清晰的天空线的建筑物内),那么它将永远不会发送结果。这实际上是正确的行为——你想要高精度,它等到你拥有它。

如果准确度较低,请使用不同的优先级类型。否则你将不得不接受你可能永远不会得到回应。

顺便说一句,即使在最佳条件下,也希望它需要几秒钟。它必须在太空中找到六颗卫星才能给出答案,这需要时间。

于 2016-07-04T21:24:33.760 回答