Provider doesn't exist ? Java.lang.illegalArgumentException

  • Antworten:7
Lukas R.
  • Forum-Beiträge: 180

27.01.2015, 09:54:55 via Website

Hei Leute ich werde aus diesem Fehler einfach nicht schlau woran das liegt :(
Fällt dazu wem was ein?
image

Hier ist die Fehlermeldung:

Java.Lang.IllegalArgumentException: provider doesn't exist: 
  at at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <IL 0x00011, 0x00068>
  at at Android.Runtime.JNIEnv.CallVoidMethod (intptr,intptr,Android.Runtime.JValue[]) <IL 0x00069, 0x00293>
  at at Android.Locations.LocationManager.RequestLocationUpdates (string,long,single,Android.Locations.ILocationListener) <IL 0x000a4, 0x0047b>
  at HKEDV_GPS.MapFragment.OnResume () [0x00008] in t:\Lukas Reiner\Programmierung\Projekte\HKEDV_GPS\HKEDV_GPS\Fragmente\MapFragment.cs:61
  at at Android.App.Fragment.n_OnResume (intptr,intptr) <IL 0x0000a, 0x0009f>
  at at (wrapper dynamic-method) object.f398f316-67de-4bf6-83fb-e5934f52c5cd (intptr,intptr) <IL 0x00011, 0x0003b>
  at --- End of managed exception stack trace ---
  at java.lang.IllegalArgumentException: provider doesn't exist:
  at at android.os.Parcel.readException(Parcel.java:1544)
  at at android.os.Parcel.readException(Parcel.java:1493)
  at at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:584)
  at at android.location.LocationManager.requestLocationUpdates(LocationManager.java:867)
  at at android.location.LocationManager.requestLocationUpdates(LocationManager.java:459)
  at at hkedv_gps.MapFragment.n_onResume(Native Method)
  at at hkedv_gps.MapFragment.onResume(MapFragment.java:43)
  at at android.app.Fragment.performResume(Fragment.java:2096)
  at at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:928)
  at at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
  at at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1049)
  at at android.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1879)
  at at android.app.Activity.performResume(Activity.java:6029)
  at at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2940)
  at at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2982)
  at at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365)
  at at android.app.ActivityThread.access$800(ActivityThread.java:144)
  at at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
  at at android.os.Handler.dispatchMessage(Handler.java:102)
  at at android.os.Looper.loop(Looper.java:135)
  at at android.app.ActivityThread.main(ActivityThread.java:5221)
  at at java.lang.reflect.Method.invoke(Native Method)
  at at java.lang.reflect.Method.invoke(Method.java:372)
  at at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
  at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Und hier der Code:

    public class MapFragment : Fragment, ILocationListener
    {
        Location currentLocation;
        LocationManager locationManager;

        string locationProvider;
        string locationText;
        string addressText;


        // Fragment wird definiert
        public static Fragment NewInstance(int position)
        {
            Fragment fragment = new MapFragment();
            Bundle args = new Bundle();
            return fragment;
        }


        // Layout wird angegeben
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            Toast.MakeText (Activity,"Position gefunden!", ToastLength.Long);
            //Kriterien für den Provider
            locationManager = (LocationManager)Activity.GetSystemService(Context.LocationService);
            Criteria criteriaForLocationService = new Criteria{

                Accuracy = Accuracy.Coarse,
                PowerRequirement = Power.Medium
            };
            IList<string> acceptableLocationProviders = locationManager.GetProviders(criteriaForLocationService, true);

            if (acceptableLocationProviders.Any ()) {
                locationProvider = acceptableLocationProviders.First ();
            } else {
                locationProvider = String.Empty;
            };
            return inflater.Inflate(Resource.Layout.map, container, false);
        }

        //Wenn das Layout geladen ist
        public override void OnResume()
        {
            base.OnResume();
            locationManager.RequestLocationUpdates(locationProvider, 0, 0, this);
        }

        //Wenn im Hintergrund
        public override void OnPause()
        {
            base.OnPause();
            locationManager.RemoveUpdates(this);
        }


        //Wird aufgerufen wennn Position verändert wurde
        public void OnLocationChanged(Location location)
        {
            try
            {
                currentLocation = location;

                if (currentLocation == null)
                    locationText = "";
                else
                {
                    locationText = String.Format("{0},{1}", currentLocation.Latitude, currentLocation.Longitude);

                    Geocoder geocoder = new Geocoder(Activity);


                    IList<Address> addressList =  geocoder.GetFromLocation(currentLocation.Latitude, currentLocation.Longitude, 10);

                    Address address = addressList.FirstOrDefault();

                    if (address != null)
                    {
                        StringBuilder deviceAddress = new StringBuilder();

                        for (int i = 0; i < address.MaxAddressLineIndex; i++)
                            deviceAddress.Append(address.GetAddressLine(i))
                                .AppendLine(",");

                        addressText = deviceAddress.ToString();
                    }
                    else
                        addressText = "";
                }
            }
            catch
            {
                addressText = "";
            }

        }

        public void OnProviderDisabled(String provider)
        {

        }

        public void OnProviderEnabled(String provider)
        {

        }

        public void OnStatusChanged(String provider, Availability status, Bundle extras)
        {

        }


    }
}

MFG Lukas R.
Programmieren ist nicht nur eine Wissenschaft, sondern auch ein Lifestyle!

Antworten
Sven R.
  • Forum-Beiträge: 1.904

27.01.2015, 13:42:01 via App

Erstens eine Interessefrage: Das ist doch kein Java; ist das C#?

Zum Problem: Debug deinen String locationProvider. Es könnte ja sein, dass in dem else Block von der if String.Empty zugewiesen wird.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Lukas R.
  • Forum-Beiträge: 180

27.01.2015, 15:43:54 via Website

Ja dass ist C# :)

Ich habe mal den string locationProvider versucht zu debuggen doch schon beim Start der App kommt es zu diesem Fehler ohne dass ich den String erst debuggen kann.

Ich denke dass liegt daran dass der Fehler in der "OnResume" gecodet ist.
Die OnResume wird ja sofort aufgerufen wenn die App das Layout laden will.

Der locationProvider string wird außerdem wie du dir es schon gedacht hast hier definiert:

locationManager = (LocationManager)Activity.GetSystemService(Context.LocationService);
    Criteria criteriaForLocationService = new Criteria{

        Accuracy = Accuracy.Coarse,
        PowerRequirement = Power.Medium
    };
    IList<string> acceptableLocationProviders = locationManager.GetProviders(criteriaForLocationService, true);

    if (acceptableLocationProviders.Any ()) {
        locationProvider = acceptableLocationProviders.First ();
    } else {
        locationProvider = String.Empty;
    };

Doch es schein so als würde dieser Code erst gar nicht aufgerufen werden bzw dass ich in dem Code was vergessen habe oder dass sich darin ein Fehler befindet.

Jetzt gerade fällt mir auf wenn ich den Code Snippet so ansehe dass da steht bei locationManager.GetProviders dass er Provider suchen soll die den Criterien die in new Criteria definiert sind entsprechen. Die If Schleife sagt aber wenn keine Provider exestieren die den Kriterien entsprechen soll der string locationProvider Empty bleiben, sprich leer.

Wenn jetzt die App locationUpdates einfordert aber der string von locationProvider leer ist kann er keine Updates bringen und wirft den Fehler. Und da im Prinzip kein Provider exestiert der "keinen Namen" hat da der string ja leer ist, wirft er mir den Fehler dass dieser Provider nicht exestiert.

Lieg ich da richtig?

— geändert am 27.01.2015, 15:48:22

MFG Lukas R.
Programmieren ist nicht nur eine Wissenschaft, sondern auch ein Lifestyle!

Antworten
Sven R.
  • Forum-Beiträge: 1.904

27.01.2015, 16:09:53 via App

Ich musste erstmal googlen, was IList#Any() ist. 😁 Ich habe noch nie mit C# gearbeitet(siehe Signatur; Humor nicht übersehen! ☺). Scheint sowas wie List#size() > 0 zu sein. Auch dann noch die ganzen großgeschrieben Methoden Namen 😲.

Aber egal.

Ja, deine Idee ist richtig. Vor Benutzung des Strings auf null (oder String.Empty) prüfen.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Lukas R.
  • Forum-Beiträge: 180

27.01.2015, 16:22:44 via Website

Haha deine Beschreibung passt perfekt :D

IList kann man sich einfach wie eine Liste vorstellen die vorhanden ist aber nirgends angezeigt wird.
Also in diese IList kommen dann alle potenziell möglichen Provider rein die die definierten Criterien besitzen.

Da aber bei mir kein Povider passt ist diese IList leer und dadurch auch der String locationProvider.
Der String locationProvider würde nähmlich einfach den 1. Provider (zb GPS) der in der IList eingetragen ist hernehmen.

Also wie würdest es jetzt du machen nur von der Idee her jetzt. Beim start der App prüfen lassen ob der String.Emty ist und dann?
Wie sollte es dann weitergehen?
Ich denke dann sollte er wieder einen Check machen ob Provider aviable sind.
Dass Problem ist nur dass dieser Fehler immer geworfen wird wenn kein Provider aviable ist der die Kriterien hat.
Doch ich brauche Kriterien dass der Code läuft.
Man müsste es irgendwie schaffen die Kriterien für den Provider so zu definieren das potenziell jeder Provider in diese Kriterien passt.
Oder nicht?

MFG Lukas R.
Programmieren ist nicht nur eine Wissenschaft, sondern auch ein Lifestyle!

Antworten
Sven R.
  • Forum-Beiträge: 1.904

27.01.2015, 19:52:46 via App

Also sind dir die Kriterien egal? Hauptsache irgendein Provider?

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Lukas R.
  • Forum-Beiträge: 180

27.01.2015, 19:58:22 via Website

Ja mir wären die Kriterien im Prinzip egal hauptsache ein Provider wird genützt, sei es Internet oder GPS

MFG Lukas R.
Programmieren ist nicht nur eine Wissenschaft, sondern auch ein Lifestyle!

Antworten
Sven R.
  • Forum-Beiträge: 1.904

27.01.2015, 22:00:39 via App

Dann übergib laut http://stackoverflow.com/a/15679274 eine "leere" Criteria oder für alle Werte No_Requirrement http://developer.android.com/reference/android/location/Criteria.html#NO_REQUIREMENT
Oder guck dir seine Antwort an http://stackoverflow.com/a/15679999
Anscheinend gibt es eine Beispiel app von Google. Die werden das schon ziemlich richtig gemacht haben.

Ich habe noch gar nicht mit Positionsbestimmung gearbeitet. 😁

— geändert am 27.01.2015, 22:01:07

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten