map.movecamera führt zu App absturtz? Location/Google Maps App

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

04.02.2015, 12:28:40 via Website

Hei Leute
bevor ihr mir nicht helft da ihr seht dass es in C# geschrieben ist möchte ich euch sagen dass der Code ziehmlich Java ähnelt.
Mein Problem besteht darin dass meine App zwar Location Daten bekommt aber immer wenn die App dann zur Position zoomen soll sie abstürtzt. Die LocationDaten werden auch als LatLng angegeben. Doch immer wenn die ersten Daten in die App kommen genau an dem Punkt wo die Camera auf der Map zoomen sollte stürtzt sie ab.

Der Code ist säuberlich geschrieben also sollte es keine großen Probleme bei der überprüfung geben.
Fällt euch da was auf an was es liegen könnte?
Habe ich LatLng falsch defiert?
Also ich komm mit dem AppCrash einfach nicht zurecht da es mir keine Fehler anzeigt und wenn ich die App debugge chrasht sie nicht aber dass Fenster bleibt weiß aber dass liegt daran dass ich es nicht richtig debuggen kann da beim debuggen momentan keine Internetverbingung besteht sodass ich den Crash überprüfen könnte.

Hier der Code:

namespace HKEDV_GPS
{
    [Activity (Label = "Location", MainLauncher = true, Icon = "@drawable/icon", Theme = "@style/Theme.Hkedvgps_blue")]         
    public class Location : Activity, ILocationListener
    {

        //Location 
        LocationManager _locMgr;

        //Map 
        GoogleMap _map;
        MapFragment _mapFragment;

        //Camera
        CameraUpdate cameraUpdate;
        CameraPosition cameraPosition;

        LatLng locationPoint;

        //OnCreate
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.map); 
            _locMgr = GetSystemService(LocationService) as LocationManager;
            InitMapFragment();
            SetupMapIfNeeded();
        }


        //Wenn GPS Position geändert wurde
        public void OnLocationChanged(Android.Locations.Location location)
        {
            //Location Text mit (Latitude, Longitude)
            locationPoint = new LatLng (location.Latitude, location.Longitude);

        }


        //Wenn das Layout geladen ist
        protected override void OnResume()
        {
            base.OnResume();

            //Kriterien für Provider
            Criteria locationCriteria = new Criteria();
            locationCriteria.Accuracy = Accuracy.NoRequirement;
            locationCriteria.PowerRequirement = Power.NoRequirement;

            string locationProvider = _locMgr.GetBestProvider(locationCriteria, true);
            if (!String.IsNullOrEmpty(locationProvider))
            {
                _locMgr.RequestLocationUpdates(locationProvider, 10000, 1, this);
            }   
            else
            {
                Toast.MakeText (this, "Keinen Provider gefunden", ToastLength.Long).Show ();
            }

            //Camera Builder
            CameraPosition.Builder builder = CameraPosition.InvokeBuilder();
            builder.Target(locationPoint);
            builder.Zoom(15);
            cameraPosition = builder.Build();
            cameraUpdate = CameraUpdateFactory.NewCameraPosition(cameraPosition);
            _map.AnimateCamera (cameraUpdate);
        }


        //Wenn die App im Hintergrund ist
        protected override void OnPause()
        {
            base.OnPause();
            _locMgr.RemoveUpdates(this);
        }


        //Map initialisieren
        private void InitMapFragment()
        {
            _mapFragment = FragmentManager.FindFragmentByTag("map") as MapFragment;
            if (_mapFragment == null)
            {
                GoogleMapOptions mapOptions = new GoogleMapOptions()
                    .InvokeMapType(GoogleMap.MapTypeNormal)
                    .InvokeZoomControlsEnabled(false)
                    .InvokeCompassEnabled(true);


                FragmentTransaction fragTx = FragmentManager.BeginTransaction();
                _mapFragment = MapFragment.NewInstance(mapOptions);
                fragTx.Add(Resource.Id.mapWithOverlay, _mapFragment, "map");
                fragTx.Commit();
            }
        }


        //Wenn die Map initialisiert werden muss
        private void SetupMapIfNeeded()
        {
            if (_map == null)
            {
                _map = _mapFragment.Map;
                if (_map != null)
                {
                    Toast.MakeText (this, "Map erfolgreich geladen", ToastLength.Short).Show ();
                }
            }
        }


        public void OnProviderDisabled(string provider)
        {
            //Not implemented
        }

        public void OnProviderEnabled(string provider)
        {
            //Not implemented
        }

        public void OnStatusChanged(string provider, Availability status, Bundle extras)
        {
            //Not implemented
        }


        //Menu Items werden hier hinzugefügt
        public override bool OnCreateOptionsMenu(IMenu menu)
        {
            MenuInflater inflater = new Android.Views.MenuInflater (this);
            inflater.Inflate (Resource.Menu.items, menu);
            return base.OnCreateOptionsMenu(menu);
        }


        //Aktionen für das Menu
        public override bool OnOptionsItemSelected(IMenuItem item)
        {
            switch (item.ItemId)
            {
            case Resource.Id.car:
            var intent = new Intent(this, typeof(KMBook));
            StartActivity(intent);
            return true;
            }
            return base.OnOptionsItemSelected(item);
        }

    }
}

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.02.2015, 15:08:02 via Website

Eigentlich kann das nicht sein. Wenn die App einen FC hat, dann muss es ja auch eine Fehlermeldung geben. Hatte ich noch nie dass bei einem FC nichts in LogCat steht.

Aber irgendwie verstehe ich deinen Code nicht ganz. Du dast ja den LocationManager, welcher deine LatLon variable aktualisiert.
Nur wo wird diese Variable mit der Google Map in Verbindung gebracht, bzw, synchronisiert?
Wel eigentlich musst du ja im LoactionChanged der Map die neue GPS Pos mitteilen, so ungefär: (pseudocode)
map.updateLocation(_location);.. etc.

Aber das sehe ich hier nirgends

LG Pascal //It's not a bug, it's a feature. :) ;)

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

04.02.2015, 15:44:10 via Website

Dass Problem ist um die Map aufzurufen muss man ja den Sha1 Fingerprint angeben in der Api Console.
Ich habe nur den Sha1 vom richtigen Keystore angegeben nicht dem von Debug.Keystore.
Deswegen kommt es beim Debuggen auch nicht zum Absturz da die Map nichtmal geladen wird.

Oha von updateLocation für die Map bzw dass man der Map die Gps daten mitteilen muss habe ich noch nie was gehört ;o muss ich dann sofort ausprobieren..
Ich dachte so:

In der LocationChanged bekomme ich die Gps daten und dann in der onResume muss ich nur der Camera die daten mitteilen wohin sie sich bewegen muss?

— geändert am 04.02.2015, 15:49:52

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.02.2015, 16:04:45 via Website

Beachte: OnResume wird nur aufgerufen wenn die App im Hintergrund war und wieder in den Fordergrund gerufen wird!
Das ewegen muss bei jedem onChanged passieren.

LG Pascal //It's not a bug, it's a feature. :) ;)

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

04.02.2015, 16:07:01 via Website

Aber der Code von OnResume ist sehr Wichtig und sollte nach der OnCreate aufgerufen werden. Wie kann ich das Regeln bzw wo sollte der Code dann hin und wie?

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.02.2015, 16:16:33 via Website

Den würde ich in einer eigenen Methode auslagern und diese im onResume und in der onCreate aufrufen.

LG Pascal //It's not a bug, it's a feature. :) ;)

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

04.02.2015, 16:36:40 via Website

Habs jetzt so eine Methode für LocationUpdates gemacht:

//Methode für Location Updates
        public void StartLocationUpdates (){

            //Kriterien für Provider
            Criteria locationCriteria = new Criteria();
            locationCriteria.Accuracy = Accuracy.NoRequirement;
            locationCriteria.PowerRequirement = Power.NoRequirement;

            string locationProvider = _locMgr.GetBestProvider(locationCriteria, true);
            if (!String.IsNullOrEmpty(locationProvider))
            {
                _locMgr.RequestLocationUpdates(locationProvider, 10000, 1, this);
            }   
            else
            {
                Toast.MakeText (this, "Keinen Provider gefunden", ToastLength.Long).Show ();
            }

        }

Dann in der OnCreat:

//OnCreate
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.map); 
            _locMgr = GetSystemService(LocationService) as LocationManager;
            InitMapFragment();
            SetupMapIfNeeded();
            StartLocationUpdates ();
        }

Und in OnResume:

//Wenn aus Hintergrund kommt 
    protected override void OnResume()
    {
        base.OnResume();
        StartLocationUpdates ();

        }

— geändert am 04.02.2015, 16:40:56

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.02.2015, 16:44:26 via Website

So funktioniert es jetzt?

Warscheinlich nicht, ich sehe nämlich noch keine Verbindung zur Google Map. Da müssen ja die Koordinaten irgendiwe hinkommen.

LG Pascal //It's not a bug, it's a feature. :) ;)

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

04.02.2015, 16:54:48 via Website

nein habs mal so probiert um sicher zu gehen stürzt aber immer noch ab

also liegt es mit sicherheit daran.
dass problem jetzt ist noch dass ich im internet nichts ähnliches wie _map.UpdateLocation oder sonstiges gefunden habe.
Hast du schonmal sowas in der art gesehen oder mal geschrieben?

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.02.2015, 16:57:53 via Website

Bei d.android.com findet man für Java das:

    private GoogleMap mMap;
// Create a LatLngBounds that includes Australia.
private LatLngBounds AUSTRALIA = new LatLngBounds(
  new LatLng(-44, 113), new LatLng(-10, 154));

// Set the camera to the greatest possible zoom level that includes the
// bounds
mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(AUSTRALIA, 0));

Quelle: https://developers.google.com/maps/documentation/android/views

Da muss es in C# etwas vergleichbares geben.

— geändert am 04.02.2015, 16:58:06

LG Pascal //It's not a bug, it's a feature. :) ;)

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

04.02.2015, 17:08:14 via App

Ja aber LatLngBounds braucht man nur wenn man Hardgecodete LatLng benützt und das mehrere. Wenn man nur 1 brauch dann nimmt man doch nur LatLng.

LatLng wird in meinem Fall bei Location Change mit GPS Daten gefüllt und darunder wird wie in deinem Beispiel hier auch bei mir eine Camera erstellt wo steht camera.Target(locatonPoint)
und danach _map.MoveCamera(cameraUpdate)

Der Block ist genau dasselbe wie deiner in Java?

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.02.2015, 17:38:27 via Website

Welchen Block meinst du?

HAbe gerade gesehen, bei dir im Code fehlt das _map.MoveCamera(ect...); das muss immer bei einem LocationUpdate gemacht werden.

LG Pascal //It's not a bug, it's a feature. :) ;)

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

04.02.2015, 17:55:55 via App

wenn du ganz beim 1. code schaust bei OnResum hatte ich es drinnen....

jetz hab ich es mal weggelassen beim neuen code um zu sehen ob es an dem block liegt dass sie abstürtzt...

das komische ist aber dass die app auch abstürtzt wenn das mit der camera gar nicht drin ist im code....

die app stürtzt also sofort ab sobalt die 1. location daten reinkommen

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.02.2015, 18:00:46 via Website

Dann gibt es irgendwo ne Exception. Aber ohne Fehler oder Debugmöglichekeiten hast du keine Chance den Fehler zu feinden.
Dir bleibt nur übrig den debugger zu Verwenden un deinen Code Zeile für Zeile (F11) duchzugegen und dir alles genau anzuschauen.

Dann bekommst du raus, ob der Fehler in der onLocationchanged liegt oder schon davor.

LG Pascal //It's not a bug, it's a feature. :) ;)

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

04.02.2015, 18:03:59 via App

Okey werde ich morgen Probieren und die ergebnisse schreiben.

um es richtig zu debuggen dass ich die map bekomme beim debugger lieg ich schon richtig dass ich in der api console beim googel maps v2 api den sha1 fingerprint vom debug.keystore nehmen muss ?

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.02.2015, 18:23:05 via Website

Jup die App wird ja standardmäßig mit dem Debug keystore signiert

LG Pascal //It's not a bug, it's a feature. :) ;)

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

09.02.2015, 11:18:01 via Website

Wie man im bild sieht habe ich jetzt viele breakpoints gesetzt und bin es schritt für schritt durgegangen, dabei ist mir eine sache aufgefallen und zwar sobalt die app von der onCreate in StartLocationUpdates springt fängt das komische an. Wie folgt:

  1. Sie untersucht die Kriterien für den Provider.
  2. Sie sucht einen Provider der den Kriterien entspricht.
  3. Sie findet einen Provider und versucht, wie in der IF Schleife geschrieben, Location Updates zu bekommen.

Bis dahin läuft alles
Und sobalt die updates eigentlich hereingekommen sind müsste die app ja in OnLocationChanged springen.
Aber anstatt das zu tun springt sie wieder zum 1. Punkt den ich gerade beschrieben habe.
Also wieder zur Criteria.
Und wenn ich sie dann weiterlaufen lasse die App wird zwar die Map angezeigt aber passieren tut nichts.....

Dass ist momentan der Stand der Dinge.
Wie könnte man das jetzt lösen?

image

— geändert am 09.02.2015, 11:56:15

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.02.2015, 13:31:14 via Website

Jetzt geht es über die Aufrufliste herauszufinden von wo aus StartLocationUpdates jedesmal wider aufgerufen wird.

LG Pascal //It's not a bug, it's a feature. :) ;)

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

09.02.2015, 15:33:09 via Website

Aufrufliste?

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.02.2015, 16:42:56 via Website

Aufrufliste gibt an von wo die Methode aufgerufen wurde.
Gibts irgendwo als Fenster in VS.

LG Pascal //It's not a bug, it's a feature. :) ;)

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

09.02.2015, 16:47:13 via App

Okey dann muss ich es in VS öffen da ich momentan mit Xamarin arbeite..
Ich loste dann das Bild der Aufrufloste hier hinein.

Eine Frage hab ich bis dahin noch:
Im prinzip ist es doch logisch dass es beim debuggen bei locationUpdates stecken bleibt.

Der debugger bekommt ja keine location Daten und ich habe iwo ik Internet mal gelesen dass müsste man iwie mit "Mock Locations" machen ....

Denn erst dann wenn wir im debugger location daten bekommen auch wenn sie nur gefaket sind können wir herausfinden durch was die app abstürtzt? Oder nicht?

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.02.2015, 16:49:26 via Website

Achso ich dachte du benutzt VS Xamarin plugin (oder so ähnlich).
KP ob es etwas vergleichbares in deiner IDE gibt.

LG Pascal //It's not a bug, it's a feature. :) ;)

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

09.02.2015, 16:51:27 via App

Nein ich benutze direkt Xamarin und da gibt es die funktion mit den Listen nicht ... aber daran liegt nicht das problem da ich das projekt auch in vs öffnen kann

meine Frage ist nur ob dass mit den Mock Locations stimmt wie ich geschrieben habe?

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

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

09.02.2015, 20:09:30 via App

Ich glaube Pascal meint den Stack(trace). Den kann man im Debugger an einem Haltepunkt einsehen (jedenfalls bei Android Studio).

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

10.02.2015, 08:00:18 via App

Ja leider hat Xamarin derartige Funktionen nicht .... da kann man nur die breakpoints setzen und das wars

was ich meinte ist aber wie man dem debugger "fake" gps daten geben kann denn ich muss ja debuggen was passiert wenn die gps positionen reinkommen ....

geht das mit mock locations oder so in der art?

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

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

10.02.2015, 13:04:11 via App

Ja, guck im ddms.

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