FusedLocationApi.getLastLocation 始终为 null

83

我希望在我的Android项目中简单地获取设备位置,为此我使用play-services的方法:

    protected synchronized void buildGoogleApiClient() {

    mGoogleApiClient = new GoogleApiClient.Builder( MainSearchActivity.this )
        .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
            @Override
            public void onConnected( Bundle bundle ){
                Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
                if( location == null ){
                    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, new LocationListener() {
                        @Override
                        public void onLocationChanged(Location location) {
                            lastLocation = location;
                        }
                    });
                }
            }
            @Override
            public void onConnectionSuspended( int i ){

            }

        })
        .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
            @Override
            public void onConnectionFailed( ConnectionResult connectionResult ){
                if( connectionResult.hasResolution() ){
                    try {
                        // Start an Activity that tries to resolve the error
                        connectionResult.startResolutionForResult(MainSearchActivity.this, CONNECTION_FAILURE_RESOLUTION_REQUEST);
                    }catch( IntentSender.SendIntentException e ){
                        e.printStackTrace();
                    }
                }else{
                    Utils.logger("Location services connection failed with code " + connectionResult.getErrorCode(), Utils.LOG_DEBUG );
                }
            }
        })
        .addApi(LocationServices.API)
        .build();

    mGoogleApiClient.connect();
}

public Location retrieveLastLocation(){
    Location loc = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    if( loc == null)
    {

    }
    return loc; //TODO: What if loc is null?
}

loc变量始终为null。在不同的手机上,每次都是这样。同时,我试图在onLocationChanged中赋值的lastLocation也从未改变过。始终为null。

这些是我为应用设置的权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="com.vogella.android.locationapi.maps.permission.MAPS_RECEIVE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

我就是不明白:为什么LocationServices不能获取位置?我已经在我测试的三个设备上启用了所有的地理位置设置。


2
我请求您请查看此答案https://dev59.com/tlsV5IYBdhLWcg3wwhHw#35833552 - Subho
2
com.google.android.gms:play-services-location:17.1.0 开始,现在有一个 getCurrentLocation() 方法,它会主动尝试获取用户的当前位置。https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient#getCurrentLocation(int,%20com.google.android.gms.tasks.CancellationToken) - Andre Romano
13个回答

0

这与Amit K. Saha的答案有关,但对于我,在我的一个Lollipop设备上,我一直得到null。所以我打开了地图应用程序,我得到了下面的屏幕,要求我打开所有的爵士乐来改善我的位置。

一旦我这样做了一次,我的设备就能够通过只调用getLastLocation()来接收位置;

我认为,那么对于可能尚未使用他们的地图应用程序的用户,我们必须在应用程序安装时请求这些权限。

enter image description here


你应该按照这里所描述的方式从你的应用程序中触发该对话框。 - manfcas

0

我安装了一个带有 Google Play 服务的模拟器,并且它可以正常工作。


-1
要进行单个位置请求,您可以使用: 方法1 -> getCurrentLocation()
cancellationTokenSource = CancellationTokenSource()

val currentLocationTask = LocationServices
        .getFusedLocationProviderClient(requireContext()).getCurrentLocation(
            LocationRequest.PRIORITY_HIGH_ACCURACY,
            cancellationTokenSource.token
        )

你可以使用以下方式取消请求,

cancellationTokenSource.cancel()

方法二-> setNumUpdates(1)

mLocationRequest
        .setNumUpdates(1)

3
目前他们更改了API,requestLocationUpdates()方法无法获取null值。 - CoolMind

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