Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. Druckvorgang starten.

Zur Standardansicht zurückkehren.

Entwicklerübersicht

Alles Relevante für die Weiterentwicklung der FieldMApp.

Übersicht

TODO: Warum sollte man die FieldMApp nutzen? In wie fern erleichtert es die Entwicklung eigener (aufbauender) Datenaufnahme-Apps? Auf welchen Systemen wird die FieldMApp unterstützt?

Aufsetzen der Entwicklungsumgebung

Das Projekt nutzt Visual Studio Community 2019 als Entwicklungsumgebung. Dabei muss für Xamarin.Forms bei der Installation (oder nachträglich mit dem Visual Studio Installer) das Paket “Mobile Entwicklung mit .NET” ausgewählt worden sein.

Allgemeines

Die FieldMApp ist modular aufgebaut. Für Module stehen verschiedene verschiedene Funktionalitäten bereit, darunter:

  • Nutzerverwaltung
  • Zugriff auf grundlegende Smartphone-Sensorik
  • App-Navigation
  • Datenbankzugriff

Diese werden durch eine Schnittstelle im Basismodul “DlrDataApp.Modules.SharedModule” verfügbar gemacht und können von allen anderen Modulen genutzt werden.

Module

TODO: Abhängigkeitsdiagramm

ModulartikelKurzbeschreibung
ProfilingEvaluieren der Nutzerkompetenz durch mehrere Fragen und anschließender Selbsteinschätzung
ProjekteImportieren und Ausfüllen von ODK Formularen
FahrtansichtNutzergesteuerte Kartierung von besonderen Gebieten auf landwirtschaftlich genutzten Feldern

1 - Module - Profiling: Entwickler

Informationen über die Software-Umsetzung des Profilings.

Übersicht

TODO: Wie ist das Modul aufgebaut? Wie kann man es erweitern?

Struktur der Modul-Navigation

Das Profiling-Modul nutzt den Navigations-Stack um die einzelnen Seiten anzuzeigen. Angezeigt wird immer nur die oberste Seite. Dabei liegt die Hauptseite des Moduls die ganze Zeit am Boden vom Stack und wird nie entfernt. Sobald eine Kategorie ausgewählt wird, wird eine Seite mit einem Lade-Icon auf den Stack geladen. Erst darauf dann die entsprechende Frage-/Auswertungsseite. Beim Schließen der Frage-/Auswertungsseite muss die Seite mit dem Lade-Icon auch entfernt werden damit man wieder das Hauptmenü sieht.

Generelle Modul-Struktur

Die gesamte organisatorische Struktur liegt in der Klasse SurveyManager. Dies umfasst:

  • das Erzeugen und Anzeigen neuer Frageseiten (bzw Pushen in den Navigations-Stack)
  • das Erzeugen der Auswertungsobjekte
  • das Erzeugen und Anzeigen neuer Auswertungsseiten
  • das Aufrufen der Funktionen zum Speichern und Laden von Fragen und Antworten (die Funktionen werden bereitgestellt durch DatabankCommunication)

Diagram_2019-10-14_10-08-33

Einfügen einer neuen Fragenkategorie

1. Erstellung einer Frage-Klasse

Angenommen unsere neue einzufügende Kategorie heißt “FruitChecker”. Die Funktionalität dieser Kategorie ist für die Erklärung nachgeordnet. Sie dient hier nur als Namensplatzhalter, um zu verdeutlichen wie man Dinge benennen könnte/sollte.

Es muss sich Gedanken gemacht werden, welche Attribute die Frage und die passende Antwort brauchen, um abgespeichert zu werden. Dann erstellt man eine neue Klasse im Namespace “MobileDataCollection.Survey.Models” QuestionFruitCheckePager.cs, welche die Klasse für die Fragen darstellt. Benennungsschema und Namespace sind hier wichtig, da die zugehörigen Klassen einer Fragekategorie mit Reflection gesucht werden. Sie erbt Methoden und Eigenschaften von der Klasse BindableObject. Außerdem muss sie das Interface IQuestionContent implementieren. Das bedeutet sie muss sowohl int InternId, welches als Primärschlüssel dient, und int Difficulty, welches die Schwierigkeit der Frage angibt, implementieren. Andere benötigte Attribute können dann auch in QuestionFruitCheckerPage definiert werden. Man kann sich hier an den schon erstellten Klassen QuestionDoubleSliderPage.cs, QuestionImageCheckerPage.cs, QuestionStadiumPage.cs und QuestionIntrospectionPage.cs orientieren.

2. Erstellung einer Antwort-Klasse

Man muss eine Klasse für die Antworten erstellen, was in unserem Beispiel AnswerFruitCheckerPage.cs im Namespace “MobileDataCollection.Survey.Models” entspricht. Diese Klasse erbt BindableObject und das Interface IUserAnswer. Das heißt, es muss int InternId implementiert werden, der hier auch als Primärschlüssel dient, um die Antwort einer Frage zuzuordnen. Es muss auch eine Methode float EvalulateScore(IUserAnswer) implementiert werden. Diese gibt den Wert (zwischen 0 und 100) zurück, wie gut diese Frage beantwortet wurde. Dann benötigt die Klasse noch die erwarteten Antworten. Man kann sich hier an den schon erstellten Klassen AnswerDoubleSliderPage.cs, AnswerImageCheckerPage.cs, AnswerStadiumPage.cs und AnswerIntrospectionpage.cs orientieren.

3. Erstellung eines Layouts

Wenn ein neues Layout für diese Kategorie geschrieben werden soll, dann wird dieses wird als XAML “FruitCheckerPage.xaml” im Namespace “MobileDataCollection.Survey.Views” gespeichert. Für die Gestaltung sind keine Grenzen gesetzt. Es muss darauf geachtet werden, dass die App hauptsächlich von Durchschnittsbenutzern genutzt wird und man deshalb das Design sowie Interaktionen simple und intuitiv gestaltet. Auch sollten die Button WeiterButton, AbbrechenButton und BackButton im Layout enthalten sein, um über die verschiedenen Kategorien ein einheitliches Design zu behalten.

Diese XAML Datei hat eine zugehörige Klasse in diesem Fall “FruitCheckerPage.xaml.cs”. Sie steuert was in dem Layout angezeigt wird und was passiert, wenn man auf Button oder Bilder klickt. Diese Klasse erbt ContentPage und das Interface ISurveyPage. Der Konstruktor der Klasse benötigt die Parameter QuestionFruitCheckerPage question, int answersGiven und int answersNeeded. Die Reihenfolge der Parameter ist hier wichtig, da Instanzen der Klassen wieder über Reflection erstellt werden. Die Methoden OnWeiterButtonClicked, OnAbbrechenButtonClicked und OnBackButtonPressed können aus beispielsweise DoubleSliderPage.xaml.cs kopiert und müssen dann noch auf die Kategorie angepasst werden. Auch können die Attribute QuestionItem, AnswerItem und Header kopiert und müssen dann noch auf “QuestionFruitCheckerPage” angepasst werden. Insgesamt kann man sich bei der Implementierung der Klasse sehr an den Klassen DoubleSliderPage.xam.cs, ImageCheckerPage.xaml.cs, StadiumPage.xaml.cs und IntrospectionPage.xaml.cs orientieren.

4. Erstellung eines SurveyMenuItem

Damit man die Fragen später auch auswählen kann, muss ein SurveyMenuItem des Objektes erstellt werden. Es wird später in der MainPage in einer Liste angezeigt. Das Objekt speichert eine interne Id der Kategorie (im Beispiel von oben “FruitChecker”), den anzuzeigenden Namen der Kategorie, wie viele Fragen in der Kategorie zu beantworten sind, die maximale Anzahl an Fragen, die Anzahl an beantworteten Fragen, eine Liste mit Ids der Selbsteinschätzungsfragen für diese Kategorie, der Antwortserie (wie viele Antworten in Folge richtig bzw. falsch waren) und die aktuelle Schwierigkeitsstufe. Damit so ein Objekt erstellt wird, muss es in der JSON-Datei “surveys” in “MobileDataCollection.Survey/Android/Assets” aufgelistet sein.

5. Speichern und Laden der Fragen und Antworten

Die Klassen werden automatisch deserialisiert und serialisiert. Attribute die dabei ignoriert werden sollen, müssen mit dem JsonIgnore Attribut ausgestattet werden. Dann muss zudem noch in der Methode CreateCSVeine Schleife eingefügt werden, die alle Antworten im CSV Format speichert.

2 - Module - Projekte: Entwickler

Informationen über die Software-Umsetzung der Projekte.

Übersicht

TODO

3 - Module - Fahrtansicht: Entwickler

Informationen über die Software-Umsetzung der Fartansicht.

Übersicht

TODO: Wie ist das Modul aufgebaut? Wie kann man es erweitern?

Zustände

Die Zustände jeder Zone lassen sich in folgendem Diagramm darstellen: drivingView2_1_

Die Schadensdetail-Button (Ursache & Stärke des Minderertrags) werden von allen Zonen geteilt verwendet. Alle anderen Buttons (“Anfang”, “Stop”, Spurauswahl) sind für jede Zone einzeln vorhanden.

Spracheingabe

Bei der Spracheingabe wird folgende formale Grammatik erlaubt (angegeben in EBNF):

Programm = "abbrechen" | ZonenStart | ZonenEnde | ZonenTypisierung;
ZonenStart = "start", SpurenAufzählung;
ZonenEnde = "stop", SpurenAufzählung;
ZonenTypisierung = ( ZonenTypisierung1 | ZonenTypisierung2 | ZonenTypisierung3 | ZonenTypisierung4 ), [ "stop" ];
ZonenTypisierung1 = SpurenAufzählung, ZonenAngabe;
ZonenTypisierung2 = ZonenAngabe, SpurenAufzählung;
ZonenTypisierung3 = MinderertragsUrsache, ZonenAngabe, MinderertragsTyp;
ZonenTypisierung4 = MinderertragsTyp, ZonenAngabe, MinderertragsUrsache;
ZonenAngabe = ( ( MinderertragsUrsache, MinderertragsTyp ) | ( MinderertragsTyp, MinderertragsUrsache) | MinderertragsUrsache | MinderertragsTyp );
MinderertragsUrsache = "hang" | "nass" | "nässe" | "maus" | "wild" | "lehm" | "sand" | "kuppe" | "ton" | "verdichtung" | "wende";
MinderertragsTyp = "gering" | "mittel" | "hoch";
SpurenAufzählung = [ "zone" ], SpurenAufzählungTeil, { SpurenAufzählungTeil };
SpurenAufzählungTeil = "spur" | ( SpurBezeichnung, { SpurBezeichnung } );
SpurBezeichnung =  "eins" | "zwei" | "drei" | "vier" | "fünf" | "sechs";

4 - Entwickler: CheatSheet

Schnellhilfe für Entwickler.

APK erstellen

Anleitung für Visual Studio Community 2022 (englisch)

  1. Sicherstellen, dass “Release” (und nicht “Debug”) bei “Solution Configurations” (in 2. Reihe von oben, direkt unter “File, Edit, View, …") ausgewählt ist
  2. Im “Solution Explorer” Rechtsklick auf das Projekt “DLR_Data_App.Android” -> “Set as Startup Project”
  3. Wieder Rechtsklick auf “DLR_Data_App.Android” -> “Archive…”
  4. Nun wird die aktuelle Version der Android App archiviert. Ggf muss man hier in der Liste nochmal nach oben scrollen um das aktuellste Archiv zu sehen
  5. Das aktuellste Archiv mit Linksklick auswählen, dann unten links im Fenster auf “Distribute…” -> “Ad Hoc”
  6. Nun muss eine Identität zum signieren der APK ausgewählt werden. Wenn noch keine erstellt wurde, kann man das hier mit dem “+” machen
  7. Dann unten rechts auf “Save as…”. Nun öffnet sich ein Explorer in dem man auswählen kann wo die APK gespeichert werden soll.
  8. Mit “Speichern” wird die APK am angegebenen Ort gespeichert. An dieser Stelle muss man noch das Passwort für die Signierungsidentität eingeben.

Zu beliebigen Schritten kann das Archivieren “Value cannot be Zero” auftauchen. In dem Fall zuerst einfach nochmal das Archivieren von vorn starten.

Bestehende Module zur Android App hinzufügen

Anleitung für Visual Studio Community 2022 (englisch)

  1. Im “Solution Explorer” das Projekt “DLR_Data_App.Android” aufklappen.
  2. Unter “DLR_Data_App.Android” rechtsklick auf “References” -> “Add References”
  3. Der “Reference Manager” öffnet sich. Hier links in “Projects” wechseln, wenn es sich nicht automatisch ausgewählt hat.
  4. Immer ausgewählt sollten sein: “DLR_Data_App”, “DlrDataApp.Modules.Base.Android”, “DlrDataApp.Modules.Base.Shared”
  5. Je nachdem welche Module verfügbar sein sollen, kann man hier beliebig auswählen: (wenn ein Projekt eines Moduls ausgewählt ist, müssen es alle sein)
    • Profiling: DlrDataApp.Modules.Profiling.Android, DlrDataApp.Modules.Profiling.Shared
    • Projekte (bzw ODK Formulare): DlrDataApp.Modules.OdkProjects.Android, DlrDataApp.Modules.OdkProjects.Shared; Außerdem: das “Profiling” Modul
    • Spracherkennung: DlrDataApp.Modules.SpeechRecognition.Android, DlrDataApp.Modules.SpeechRecognition.Shared
    • Fahrtansicht (bzw Feldkartierer): DlrDataApp.Modules.FieldCartographer.Android, DlrDataApp.Modules.FieldCartographer.Shared; Außerdem: das “Spracherkennungs” Modul

Modulstruktur, Shared Methods, Navigation

Siehe Nextcloud Documentation/fieldmapp1modulexplanation.pdf