1. ホーム
  2. android

FusedLocationApi.getLastLocationは常にNULLです。

2023-10-07 23:21:13

質問

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です。異なる携帯電話でも、毎回そのようになります。また lastLocation で代入しようとすると、その onLocationChanged に割り当てようとしても、決して変更されません。常に 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 は位置を取得できないのでしょうか?テストした 3 つのデバイスすべてで、すべてのジオロケーション設定を有効にしています。

どのように解決するのですか?

融合された Location Provider は、少なくとも1つのクライアントが接続されている場合にのみ、バックグラウンドの位置を維持します。現在では、位置情報サービスをオンにするだけでは、最終的に知られている位置を保存することは保証されません。

最初のクライアントが接続すると、すぐに位置情報を取得しようとします。もしあなたのアクティビティが最初に接続したクライアントで getLastLocation() ですぐに呼び出される場合 onConnected() ですぐに呼び出されるため、最初の場所に到着するのに十分な時間ではないかもしれません。

まずマップアプリを起動して、少なくとも位置が確認できるようにしてから、アプリをテストすることをお勧めします。