mcharmas / Android-ReactiveLocation

Small library that wraps Google Play Service API in brilliant RxJava Observables reducing boilerplate to minimum.
2.11k stars 312 forks source link

No location to return for getLastLocation() / java.util.NoSuchElementException #201

Closed youlovejohnny closed 5 years ago

youlovejohnny commented 5 years ago

Hello! I'm trying to get last location: Manifest:


    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Function:

    fun getNewLocation(): Single<Location> {
        if (EasyPermissions.hasPermissions(context, Manifest.permission.ACCESS_FINE_LOCATION)) {
            val locationProvider = ReactiveLocationProvider(context)
            return locationProvider.lastKnownLocation.singleOrError()
        } else {
            throw Throwable("No permission")
        }
    }

But i got error:

W/GCoreFlp: No location to return for getLastLocation()
W/GCoreFlp: No location to return for getLastLocation()
java.util.NoSuchElementException
    at io.reactivex.internal.operators.observable.ObservableSingleSingle$SingleElementObserver.onComplete(ObservableSingleSingle.java:111)
    at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onComplete(ObservableCreate.java:97)
    at pl.charmas.android.reactivelocation2.observables.location.LastKnownLocationObservableOnSubscribe.onGoogleApiClientReady(LastKnownLocationObservableOnSubscribe.java:29)
    at pl.charmas.android.reactivelocation2.observables.BaseObservableOnSubscribe$ApiClientConnectionCallbacks.onConnected(BaseObservableOnSubscribe.java:97)
    at com.google.android.gms.common.internal.GmsClientEventManager.onConnectionSuccess(Unknown Source)
    at com.google.android.gms.common.api.internal.zaaw.zab(Unknown Source)
    at com.google.android.gms.common.api.internal.zaak.zaaq(Unknown Source)
    at com.google.android.gms.common.api.internal.zaak.onConnected(Unknown Source)
    at com.google.android.gms.common.api.internal.zabe.onConnected(Unknown Source)
    at com.google.android.gms.common.api.internal.zaq.onConnected(Unknown Source)
    at com.google.android.gms.common.internal.zaf.onConnected(Unknown Source)
    at com.google.android.gms.common.internal.BaseGmsClient$zzf.zzm(Unknown Source)
    at com.google.android.gms.common.internal.BaseGmsClient$zza.zza(Unknown Source)
    at com.google.android.gms.common.internal.BaseGmsClient$zzc.zzo(Unknown Source)
    at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(Unknown Source)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:159)
    at android.app.ActivityThread.main(ActivityThread.java:6146)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

All permissions are granted, other applications are working (e.g google maps) Whats wrong?

Asus ZC600KL (asus zenfon 5 lite) 7.1 android

All works on emulator, asus 520 (7.0), xiaomi mi 8 se (9.1), samsung s7 (8)

mcharmas commented 5 years ago

Hi, sometimes lastKnownLocation is not available and location provider just returns null. That's why getLastKnownLocation() method returns Maybe and not Single. Forcing maybe to become single throws NoSuchElementException in case it is empty. If lastKnownLocation is not available you have to fetch location differently.