web-dev-qa-db-ja.com

fusedLocationProviderClient.lastLocation.addOnSuccessListenerは常にnull

FusedLocationProviderClientを使用するようにLocationAPIを更新しましたが、この問題が発生しています。GPSをオフにしてからオンにすると、常にnullの位置が取得されます。

val fusedLocationProviderClient =
                        LocationServices.getFusedLocationProviderClient(callingActivity)
            fusedLocationProviderClient.flushLocations()
            getLocationRequest()

            checkLocationSettings(callingActivity, turnOnGpsRequestCode, callback) {
                // Location settings successful
                fusedLocationProviderClient.lastLocation
                        .addOnSuccessListener(callingActivity) {
                            location ->
                            // Here location is always null
callback.onCallback(MenumyRadar.RadarStatus.SUCCESS, location)
                        }
                        .addOnFailureListener {
                            callback.onCallback(MenumyRadar.RadarStatus.ERROR_UNKNOWN, null)
                        }
            }

GoogleマップやUberなど、位置情報を使用する別のアプリを開くまで機能しません。

この答えのおかげで私はいくつかの手がかりを持っています FusedLocationApi.getLastLocation常にnull

そしてグーグルの説明に:

fusedLocationClient.lastLocation .addOnSuccessListener {場所:場所? -> //最後の既知の場所を取得しました。まれに、これがnullになる場合があります。 }

GetLastLocation()メソッドは、地理的位置の緯度と経度の座標を持つLocationオブジェクトを取得するために使用できるタスクを返します。次の状況では、ロケーションオブジェクトがnullになる可能性があります。

場所はデバイス設定でオフになっています。ロケーションを無効にするとキャッシュもクリアされるため、最後のロケーションが以前に取得された場合でも、結果はnullになる可能性があります。新しいデバイスや工場出荷時の設定に復元されたデバイスの場合など、デバイスはその場所を記録しませんでした。デバイス上のGooglePlay開発者サービスが再起動しました。サービスの再起動後に、場所をリクエストしたアクティブなFused LocationProviderクライアントがありません。この状況を回避するには、新しいクライアントを作成して、自分で場所の更新をリクエストできます。詳細については、ロケーションアップデートの受信を参照してください。

しかし、それはこれをどのように処理するかを述べていません、私は何ができますか?

7
Jesus Almaral

私は解決策を見つけました、これは何が起こるかです、それは場所のキャッシュがクリアされたことを意味します、これはGPSをオフにしたときに起こります、それで私がそれをオンにしたとき、取得する最後の場所がありませんでした、私がしたことはこれでした:

checkLocationSettings(callingActivity, turnOnGpsRequestCode, callback) {
                // Location settings successful
                mFusedLocationProviderClient!!.lastLocation
                        .addOnSuccessListener(callingActivity) {
                            location ->
                            if (location == null || location.accuracy > 100) {
                                mLocationCallback = object : LocationCallback() {
                                    override fun onLocationResult(locationResult: LocationResult?) {
                                        stopLocationUpdates()
                                        if (locationResult != null && locationResult.locations.isNotEmpty()) {
                                            val newLocation = locationResult.locations[0]
                                            callback.onCallback(Status.SUCCESS, newLocation)
                                        } else {
                                            callback.onCallback(Status.ERROR_LOCATION, null)
                                        }
                                    }
                                }

                                mFusedLocationProviderClient!!.requestLocationUpdates(getLocationRequest(),
                                        mLocationCallback, null)
                            } else {
                                callback.onCallback(Status.SUCCESS, location)
                            }
                        }
                        .addOnFailureListener {
                            callback.onCallback(Status.ERROR_UNKNOWN, null)
                        }
            }

場所がnullの場合、コールバックを使用して場所のリクエストを開始し、

mFusedLocationProviderClient !!。requestLocationUpdates(getLocationRequest()、mLocationCallback、null)

次に、コールバックが呼び出されると、新しい場所が取得され、場所の取得が再開されます。

GPSをオンにすると、位置がnullではないのに精度が悪い場合があるので、位置の精度が十分かどうかも確認します(私にとっては100メートルで十分です)。

6
Jesus Almaral

FusedLocationPrivedClientオブジェクトでgetLocationAvailability()メソッドを使用でき、trueが返された場合は、getLastLocation()メソッドのみを使用します。それ以外の場合は、次のようなrequestLocationUpdates()メソッドを使用します。

FusedLocationProviderClient fusedLocationProviderClient =
            LocationServices.getFusedLocationProviderClient(InitActivity.this);
    if (ActivityCompat.checkSelfPermission(this.getApplicationContext(),
            Android.Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {

fusedLocationProviderClient.getLocationAvailability().addOnSuccessListener(new OnSuccessListener<LocationAvailability>() {
                @Override
                public void onSuccess(LocationAvailability locationAvailability) {
                    Log.d(TAG, "onSuccess: locationAvailability.isLocationAvailable " + locationAvailability.isLocationAvailable());
                    if (locationAvailability.isLocationAvailable()) {
                        if (ActivityCompat.checkSelfPermission(InitActivity.this.getApplicationContext(),
                                Android.Manifest.permission.ACCESS_FINE_LOCATION)
                                == PackageManager.PERMISSION_GRANTED) {
                            Task<Location> locationTask = fusedLocationProviderClient.getLastLocation();
                            locationTask.addOnCompleteListener(new OnCompleteListener<Location>() {
                                @Override
                                public void onComplete(@NonNull Task<Location> task) {
                                    Location location = task.getResult();                                    
                                }
                            });
                        } else {
                            requestLocationPermissions ();
                        }

                    } else {
fusedLocationProviderClient.requestLocationUpdates(locationRequest, pendingIntent);

                    }

                }
            });
        } else {
            requestLocationPermissions ();
        }
0
Ssubrat Rrudra