Wie den Einstieg schaffen?

  • Hallo erstmal! :)


    Schon seit längermen möchte ich gerne eine Android-App erstellen, aufgrund fehlender Navakenntnisse fällt mir das jedoch (9zu) schwer:


    Prinzipiell soll die App (erstmal) gar nicht viel können, außer das sie ein paar Daten in abhängigkeit vom aktuellen Standort anzeigt...


    Die Idee und auch die Website, die die Daten liefert, sind also vorhanden, Das SDK ist auch installiert, "Hello World" funktioniert auch - und das war's...


    Wie schaffe ich nun den Einstieg?


    Gruß
    Vermeer

  • Zitat von vermeer


    Die Idee und auch die Website, die die Daten liefert, sind also vorhanden, Das SDK ist auch installiert, "Hello World" funktioniert auch - und das war's...


    Wie schaffe ich nun den Einstieg?


    Um Java wirst du wohl nicht herumkommen, allerdings ist Java relativ einfach zu erlernen und exterm verbreitet. Programmierbeispiele zu finden sollte daher weniger ein Problem sein.


    Das Problem bei Anfängern ist aber meist, dass sie sich zuviel vornehmen. Gerade am Anfang geht das Programmieren aber nur sehr langsam voran und daher schlafen neue Projekte sehr schnell ein. Die Devise sollte daher sein, die Version 0.1.0 möglichst einfach zu halten.


    Am besten du erstellst dir erstmal eine einfache Stichpunktliste, was denn dein Programm alles können soll - eine Art Anforderungsdokument sozusagen. Dann überlegst du dir welche Features du in die allererste Version aufnehmen willst. Das sollten möglichst wenige sein, damit du schnell zu einem benutzbaren Ergebnis kommst und die ersten Erfolgserlebnisse hast.


    Sobald du dich für ein paar Features entschieden hast, überlegst du dir, wie das denn genau aussehen soll und welche Parameter du benötigst um die Features bereitstellen zu können. Du kannst z.B. die GUI mal aufmalen und musst auch Abhängigkeiten berücksichtigen. Wenn der User z.B. irgendetwas einstellen können soll, dann brauchst du natürlich auch einen Einstellungsdialog und du musst die Einstellungen irgendwo speichern. Du wirst schnell feststellen, dass selbst bei wenigen Features einiges an Abhängigkeiten zusammenkommt. Damit du nicht den Überblick verlierst solltest du das ganze genau dokumentieren. Hast du z.B. das Feature "User soll Adresse eingeben können", dann solltest du erfassen, welche Adressdaten du genau abfragen willst.


    Nachdem du festgelegt hast was dein Programm können soll, welche Eingaben du benötigst und wie es genau aussieht, geht es eigentlich an's Design der Architektur. Gerade das fällt Anfängern aber besonders schwer, da sie noch keinen vollständigen Überblick über die Programmiersprache haben und auch noch nicht mit Software-Design-Patterns vertraut sind. Du solltest dein Programm daher einfach in möglichst kleine Teile zerlegen - z.B.:


    - Hauptbildschirm
    - Einstellungsdialog
    - Positionsabfragemodul


    Hier wirst du am Anfang viele Fehler machen, aber Programmieren lernt man halt nur durch anwenden. Je weniger Features du für die Version 0.1.0 definiert hast, desto leichter wird es sein das ganze einfach umzubauen, sobald du merkst, dass es auch wesentlich eleganter geht. Für den Anfang sollten folgende Faustregeln reichen:


    - Je kleiner eine Komponente, desto besser.
    - Möglichst wenige "public" Funktionen.
    - Komponenten sollten auf möglichst wenige andere Komponenten zugreifen.


    Wenn du erstmal eine Weile programmiert hast, solltest du dich aber auch mal mit Software-Design beschäftigen. Eine vernünftige Architektur kann dir enorm viel Arbeit ersparen. Software Design ist übrigens weitgehend programmiersprachen-unabhängig, so dass du das erlernte Wissen überall einsetzen kannst.


    Sobald du deine Komponenten definiert hast, kannst du dir überlegen, wie du sie in Java umsetzt. Je kleiner du deine Komponenten definiert hast, desto leichter wird es. Bevor du mit dem Programmieren anfängst kannst du natürlich auch mal deine Idee und die geplante Umsetzung hier im Forum vorstellen.


    Viel Erfolg

  • Danke für die Antwort!
    Das java leicht ist ist relativ....
    Hmm hmm hmm, erst Java lernen zu müssen ist schon ein großes Hindernis...


    Stichpunkteliste: Die gibt's schon und so hatte ich mir das auch gedacht: Schön Schritt für Schritt nach und nach die App zu entwickleln.


    Habe auch schon länger gegoogelt, Android-Code-beispiele gibt es ja schon einige, aber die decken immer nur einen Teil meies Problems ab: Das ist für einen der sich in java auskennt durchaus hilfreich, für mich leider weniger.


    Aber viellecht beschreie ich wirklich erstmal was ich eigentlich vorhabe:
    Prinzipiell will ich eine App für meine Website http://www.kitewiese.de erstellen:
    Step 1:
    Die App kann nicht viel: Sie holt sich den Standort des Users und zeigt die in seiner Nähe befindlichen Kitewiesen an: Als Liste (Step 1.1.: auch als Karte)
    Codebeispiele für solche dieses Problem habe ich schon gefunden, nur gehen alle davon aus, dass die Daten im Handy vorhanden sind. Die Daten der eigenen Kitewiesen liegen aber auf einem Webserver....
    Step 2: User kann sich einloggen und ein paar Werte der Kitewiese ändern (Grashöhe...)
    Step 3: User kann Bilder fotographieren und hochladen



    So, das war's für's erste mal.
    Viellecht hat ja einer Lust mir dabei zu helfen (könnte ja z.B. mittles svn geschehen), die ganze Sache ist ein nichtkommerzielle Sache.
    Der Zielgruppe ist natürlich sehr stark eingeschränkt, mir geht's aber in erster Linie darum, die Android-Programmierung zu erlernen.


    Gruß und Danke
    Jörn

  • Zitat von vermeer


    Hmm hmm hmm, erst Java lernen zu müssen ist schon ein großes Hindernis...


    Nunja, wenn du Programmieren möchtest, dann musst du nunmal auch eine Programmiersprache lernen. Java ist jedenfalls eine sehr dankbare Sprache, da sie dir sehr viel Arbeit abnimmt.


    Zitat von vermeer


    Habe auch schon länger gegoogelt, Android-Code-beispiele gibt es ja schon einige, aber die decken immer nur einen Teil meies Problems ab:


    Hehe, wenn es dein Programm schon fertig als Beispiel gäbe, dann müsstest du es ja nicht mehr programmieren :)


    Wenn du deine Probleme schön sauber in einzelne Komponenten aufteilst, dann reichen diese Beispiele aus. Am Schluss baust du dann aus all den kleinen Komponenten das Gesamtsystem.



    Für Step1 reicht serverseitig natürlich ein ganz einfaches Skript. Da sich die User aber zumindest für Step3 auch authentifizieren müssen, empfiehlt es sich gleich auf sowas wie SOAP (http://de.wikipedia.org/wiki/SOAP) zu setzen. SOAP ist allerdings nicht ganz einfach und vielleicht willst du am Anfang lieber schnelle Erfolgserlebnisse. Ab Step2 allerdings würde ich mir wirklich überlegen auf SOAP zu wechseln. Das lohnt sich auf jedenfall für spätere Versionen.


    Deine allerste Version wird also so aussehen:


    • Ein Hauptbildschirm auf dem eine Liste der Kitewiesen präsentiert wird.
    • Ein Abfragemodul welches die Koordinaten an den Server übermittelt und eine Liste der Kitewiesen zurückgibt.


    Das ist doch ein sehr überschaubares Projekt um mit dem Programmieren anzufangen.


    Du musst dir also zuerst die Frage stellen, wie denn die Daten auf dem Server hinterlegt sind. Am besten sollten für jede Wiese die Geo-Koordinaten hinterlegt sein. Deine Arbeit beginnt also nicht auf dem Android-Handy, sondern auf deinem Server. Was du benötigst ist ein Skript, welches Geokoordinaten erhält und daraufhin eine Liste an Wiesen zurückgibt. Sowas kannst du z.B. in PHP schreiben.


    Die Anfrage an dein Skript erfolgt via HTTP Get request z.B. so:


    Code
    http://www.kitewiese.de/getwiesen.php?lat=<latitude>&long=<longitude>


    Das Skript erhält also einen Längen- und einen Breitengrad und muss jetzt feststellen welche Wiesen in der Nähe sind. Dazu müsstest du für jede Wiese in der Datenbank den Abstand zur aktuellen Position berechnen. Das ist aber nicht sehr datenbank- und rechnerfreundlich, weil du es nicht mit einer einzigen Abfrage erledigen kannst. Daher denkst du dir einfach ein Quadrat, dessen Mittelpunkt der aktuelle Standort ist. Dann kannst du jeweile einen Maximalen und einen Minimalen Breiten-/Längengrad berechnen und mit einer Datenbankabfrage alle Wiesen in der Nähe finden.


    Die Breitengrade haben einen konstanten Abstand von: Erdumfang/360 ~ 111km


    1 km Abstand entspricht also ca. 0.009 Breitengrad.


    Der Abstand der Längengrade ist abhängig vom Breitengrad. An den Polen ist dieser Null und am Äquator ebenfalls ca. 111km. Der genaue Abstand berechnet sich: 1 Längengrad = 1 Breitengrad * cos(Breitengrad)


    1km Abstand ist also ca. (0.009 * cos(Breitengrad)) Längengrad


    Jetzt kannst du einen maximalen Abstand in jede Richtung festlegen und dann mit einer Datenbankabfrage alle Wiesen in dem vorgegebenen Quadrat abfragen.


    Dein Skript gibt dann einfach eine Liste mit den Wiesen im Klartext (nicht HTML) aus, welche dann von deiner Android-App entgegen genommen wird. Die Liste kann z.B. so aussehen:


    Code
    <id>|<lat>|<long>|<Name>|<Beschreibung>
    1|49,3N|47,5E|Kitewiese 1|Tolle Kitewiese nahe Musterstadt
    2|.....


    Sobald du diesen Teil programmiert hast, ist der Rest eigentlich nur noch ein Klax. Du musst dann nur noch die Anfrage an den Server abschicken und das Ergebnis zeilenweise einlesen. Aus den Geo-Koordinaten der Wiesen kannst du dann auch den Abstand zur aktuellen Position berechnen und die Liste sortiert nach Entfernung ausgeben.

  • Meine Güte, "Java" ist nur eine Sprache. Du musst wissen wie man programmiert und dich dabei nicht auf eine Sprache beschränken! Die Sprache ist doch nur Syntax, dass hat man in wenigen Minuten drauf. ;)


    Schau dir ein paar Java Programme an und dann siehst du wie vieles gemacht wird, oft nicht viel anders als in anderen Sprachen. In was hast du Kitewiese.de programmiert? :)

  • Kitewiese ist in Coldfusion programmiert. Von daher ist Java nicht schlecht, denn in Coldfuison kann man auch Java-Klassen einbinden. (nebenbei: Ich verwende einen Open-Source-Coldfusion-Server Railo in verbindung mit Tomcat).


    Temar: Ich sehe die ganze Sache genau anders herum: Das von Dir beschriebene Script sollte eigentlich kein Problem darstellen, erst recht nicht mit der google-maps-api.
    Dieses Script wäre also nicht das Problem, sondern der Rest...

  • Zitat von vermeer


    Temar: Ich sehe die ganze Sache genau anders herum: Das von Dir beschriebene Script sollte eigentlich kein Problem darstellen, erst recht nicht mit der google-maps-api.
    Dieses Script wäre also nicht das Problem, sondern der Rest...


    Dann beschreibe doch mal wo genau dein Problem ist. Das berechnen der Abstände und die Suche nach den passenden Wiesen ist doch das komplizierteste an deinem Programm. Danach musst du die Liste ja nur noch ausgeben. Beispielcode zum Anzeigen einer Liste gibt es doch massig.

  • Mein Hauptproblem: Wie lade ich Daten von einem Webserver ins Android-Handy.


    Mir ist aber nochwas aufgefallen:
    Würde es eigentlich nicht mehr Sinn machen, eine (statische) seite mit allen Kitewiesen für die Android-App bereit zu halten (die Seite würde sich bei Updates natürlich erneuern):
    So hätte man gar keine Datenbank bzw. Serverlast auf dem Webserver mit ausnahme dem Bereitstellen der einen Datei. Alles andere (welche der Punkte sind am nächste zu meinem aktuellen Standort) würde dann die App machen. Würde doch auch mehr dem Charakter einer App entsprechen, das andere würde ja eher in die Richtung "Mobile version der Website) gehen. Oder sehe ich das falsch?
    Foglendes Beispiel habe ich gefunden, was wohl dem Problem am nächste kommt:
    http://blogoscoped.com/archive/2007-11-19-n27.html
    Allerdings werde da die Daten nicht erst irgendwo her geholt, sondern sind im Adressbuch des Handys.

  • Zitat von vermeer


    Mein Hauptproblem: Wie lade ich Daten von einem Webserver ins Android-Handy.



    Zitat von vermeer


    Mir ist aber nochwas aufgefallen:
    Würde es eigentlich nicht mehr Sinn machen, eine (statische) seite mit allen Kitewiesen für die Android-App bereit zu halten (die Seite würde sich bei Updates natürlich erneuern):
    So hätte man gar keine Datenbank bzw. Serverlast auf dem Webserver mit ausnahme dem Bereitstellen der einen Datei. Alles andere (welche der Punkte sind am nächste zu meinem aktuellen Standort) würde dann die App machen. Würde doch auch mehr dem Charakter einer App entsprechen, das andere würde ja eher in die Richtung "Mobile version der Website) gehen. Oder sehe ich das falsch?


    Das solltest du nicht machen, aus folgenden Gründen:


    • Eine Datenbank sucht Einträge wesentlich schneller und ressourcen-schonender als ein einfacher Parser.
    • Die Liste der Kitewiesen kann sehr lang sein => lange Ladezeiten.
    • Hast du eine lange Liste braucht das Verarbeiten sehr viel Speicher (und CPU) => elendig langsame App.


    Zitat von vermeer


    Foglendes Beispiel habe ich gefunden, was wohl dem Problem am nächste kommt:
    http://blogoscoped.com/archive/2007-11-19-n27.html
    Allerdings werde da die Daten nicht erst irgendwo her geholt, sondern sind im Adressbuch des Handys.


    Vergiss erstmal den Location-Part. Stell die Koordinaten in deinem Programm einfach erstmal fest ein und hol dir die Liste der Wiesen in der Umgebung von deinem Webserver. Das Ergebnis gibst du dann in einer Liste auf dem Bildschirm aus. Sobald das läuft kümmerst du dich um das Bestimmen der wirklichen Position. Zum testen reicht aber erstmal irgendeine fest eingestellte Position.

  • So, jetzt bin ich etwas weiter, aber nicht viel:
    Habe mir mal den Code von Temar in die "Hello World"-Beispielklasse reingeschrieben - und es passiert nichts... :(
    Meine Vermutung ist: Es passiert schon was, wird aber nicht angezeigt wegen "setContentView(R.layout.main);" ??
    Da holt er sich doch die Layoutinfos aus der mai.xml in der ja nur steht, dass er einen String anzeigen soll - aber eben nicht, dass er noch die einzelnen Zeilen "System.out.println(line);" anzeigt. Richtig? Wie müsste ich also die Klasse schreiben dass das oben genannte Codebeispiel funktioniert?
    Danke für die Hilfe
    Jörn


    PS: Ich habe eingesehen dass ich generell ohne Javakenntnisse nicht viel weiter kommen werde und bin deshalb gerade dabei, mich da mal in die Grundlagen "einzulesen"....

  • Und wieder ein Stück weiter - wenn auch nur mit den "Randarbeiten":
    Meine Seite "http://www.kitewiese.de/_app_android/nearest.cfm?Lat=<latitude>&Lng=<longitude>" ist fertig,
    die Frage ist jetzt eben "nur": Wie bekomme ich die jetzt auf dem Android angezeigt bzw. wie übermittle ich den aktuellen Standort.
    Wäre schön, wenn mir jemand helfen könnte/würde.


    Vermeer

  • Zitat von vermeer


    Und wieder ein Stück weiter - wenn auch nur mit den "Randarbeiten":
    Meine Seite "http://www.kitewiese.de/_app_android/nearest,cfm?Lat=<latitude>&Lng=<longitude>" ist fertig,


    Klappt ja sehr gut. Hab's gerade mal getestet. Ganz fertig bist du allerdings nocht nicht mit dem Skript.


    Das Problem ist, dass du unbedingt ein Trennzeichen zwischen der Beschreibung und dem Abstand benötigst, da du ansonsten Probleme beim Parsen der Antwort bekommen kannst. Die Antwort des Servers sollte also eher so aussehen:


    Code
    Stadt<Trennzeichen>Abstand
    Meine Stadt|7
    Andere Stadt|12


    Wie du an meinem Beispiel oben sehen kannst, habe ich auch gleich das "km" weggelassen. Das stört nämlich nur beim Verarbeiten der Daten und macht auch nur Sinn, wenn du in manchen Fällen auch mal Meilen zurück gibst. Falls das der Fall ist, dann sollte die Antwort aber eher so aussehen:


    Code
    Meine Stadt|7|km


    Was du auch noch bedenken musst ist, dass du dein Trennzeichen in allen Strings ersetzt. Es könnte nämlich passieren, dass jemand als Stadtname sowas eingibt: "Meine Stadt | Auf dem großen Hügel"


    Das Ergebnis wäre dann:


    Code
    Meine Stadt | Auf dem großen Hügel|7|km


    Sowas wird vom Parser natürlich falsch interpretiert. Du musst also in jedem String eventuelle Vorkommen deines Trennzeichens entweder kodieren oder aber einfach durch ein anderes Zeichen ersetzen.


    An deiner Stelle würde ich auch noch gleich die Geo-Koordinaten pro Treffer mitübermitteln, da du dann auf dem Android Handy sehr einfach Google-Maps anwerfen kannst und der Benutzer kann sich zum Standort hinnavigieren lassen.


    Zitat


    die Frage ist jetzt eben "nur": Wie bekomme ich die jetzt auf dem Android angezeigt bzw. wie übermitlle ich den aktuellen Standort.
    Wäre schän, wenn mir jemand helfen könnte/würde.


    Das mit dem Standort würde ich als letztes machen. Das ist das kleinste Problem, denn den kann man sich einfach vom Telefon zurückgeben lassen.


    Sobald du dich für ein Trennzeichen entschieden hast, können wir den Parser bauen. das geht dann ungefähr so:


  • Gut, nearest.cfm ist angepasst. (es gibt jetzt noch einen weiteren (optionalen) Parameter: unit=km (oder sm))
    Aber wie gesagt: Dein Codebeispiel wird bei mir (wie weiter oben geschrieben) nicht angezeigt.
    Ich vermute dass er die Sache auch ausführt, aber eben nicht anzeigt. Muss da an dem xml nochwas verändert werden?

  • Zitat von vermeer


    Gut, nearest.cfm ist angepasst. (es gibt jetzt noch einen weiteren (optionalen) Parameter: unit=km)


    Sehr gut. Jetzt ist es ideal für automatisches Parsen.


    Zitat


    Aber wie gesagt: Dein Codebeispiel wird bei mir (wie weiter oben geschrieben) nicht angezeigt.


    Natürlich nicht, denn es ist nur ein Parser um die Ausgabe deines Servers zu verarbeiten.


    Zitat


    Ich vermute dass er die Sache auch ausführt, aber eben nicht anzeigt. Muss da an dem xml nochwas verändert werden?


    Nicht nur da - wir haben noch einen langen Weg vor uns. Was wir als nächstes machen:


    • Erstellen einer Klasse "KiteLocation", die die Daten des Webservers aufnimmt.
    • Erstellen einer Klasse "KiteLocationQuery", der man GeoKoordinaten übergibt und die einem ein Array aus KiteLocations zurückgibt.
    • Erstellen eines Android ListAdapters, der die Daten aus einer KiteLocation Klasse für ein Android ListView aufbereitet.
    • Erstellen des Android ListViews, welches die Daten anzeigt.


    Das sind im wesentlichen die nächsten Punkte. Du kannst dir ja schonmal Gedanken darüber machen. Bin im Moment noch auf der Arbeit, hab also nicht so viel Zeit. Ich schreibe heute Abend mal mehr dazu mit ein paar Beispielen, wie das Aussehen könnte.

  • So, das wird jetzt etwas länger. Eine Warnung vorweg: Das ganze ist völlig ungetestet und wahrscheinlich kompiliert der Code nicht einmal. Ich habe das einfach in den Editor hier getippt. Sieh es als Übung an meinen Mist zu korrigieren :)


    Hier also die KiteLocation Klasse. Das ist einfach nur eine Java Bean, die die einen einzelnen Listeneintrag aufnehmen kann.


    KiteLocation.java



    Als nächstes die KiteLocationQuery Klasse. Diese holt eine Liste an Kite-Locations von deinem Webserver und gibt diese als KiteLocation-Array zurück.


    KiteLocationQuery.java



    Jetzt kommen wir zum Android Part. Wir brauchen zwei Layouts: Eins für die ListActivity und eins für jeden Eintrag in der Liste. Hier das für die ListActivity.


    res/layout/main.xml



    Jeder Eintrag unserer Liste besteht aus 2 Werten: Der Ort und die Distanz.


    res/layout/row.xml



    Und hier die eigentliche ListActivity. Diese hat als Unterklasse einen KiteLocationAdapter. Der KiteLocationAdapter mapt jeden Eintrag eines KiteLocation Arrays auf einen Listeneintrag. Der KiteLocationAdapter kann natürlich auch extern definiert werden (nicht als Unterklasse, sondern als eigenständige Klasse) - reine Faulheit meinerseits.


    KiteListActivity.java

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!