Programmier Tutorial - Apps für Android entwickeln -Hintergrund - Daten online abfragen in Android

Programmier Tutorial: Apps für Android entwickeln – Teil 8: Daten von einer Webseite abfragen in Android


Hinweis: Der Service von Yahoo! Finance wurde scheinbar eingestellt. Das großen Android Tutorial wurde daher umgeschrieben, so dass nun simulierte Finanzdaten vom eigenen Web-Server verwendet werden.

Im achten Teil unseres großen Android™ Tutorials werden wir unsere App mit dem Internet verbinden.

Über die Internetverbindung fragen wir online Finanzdaten ab und speichern die erhaltenen Daten in einem String. Den Inhalt des Strings geben wir als Log-Meldung zur Kontrolle aus. Später werden wir Teile des Inhalts in der App anzeigen.

Die Abfrage über das Internet muss in einem asynchronen Task ausgeführt werden, dies wird vom Android System so verlangt. Daher haben wir in dem vorherigen Tutorial-Teil den asynchronen Task HoleDatenTask implementiert. Er ist unser Hintergrund-Thread, der das HTTP-Request durchführt.

Bevor von unserer App aus auf das Internet zugegriffen werden kann, müssen wir von Android bzw. dem Benutzer die Erlaubnis für den Zugriff einholen. Dieser Schritt ist sehr einfach und erfordert nur eine kleine Änderung in der AndroidManifest.xml Datei.

Unser Vorgehen in diesem Teil des Android Tutorials wird wie folgt sein:

  1. Vorstellen wie wir die Finanzdaten abfragen werden
  2. Erlaubnis für den Internetzugriff in Android einholen
  3. Online Anfrage nach den Aktiendaten in dem asynchronen Task HoleDatenTask
  4. Testen unserer Android App und Kontrollieren des Aktiendaten-Strings in der Log-Meldung

Nun wünschen wir euch viel Spaß bei dem achten Teil unseres großen Android Tutorials. Los geht’s!

1. Aktiendaten von einem Server online abfragen

Unsere Android App wird verschiedene Aktiendaten ausgeben. Die Daten werden wir von unserem eigenen Server herunterladen, der sie extra zu diesem Zweck generieren wird.

Bei den Daten handelt es sich nicht um echte Aktiendaten, sondern um simulierte, die wie reale Aktienkurse erscheinen. Die Daten werden von unserem Server im XML-Format generiert und an die App über das Internet gesendet.

Die empfangenen XML-Aktiendaten werden wir dann anschließend in unserer Android App auswerten und weiterverarbeiten.

Mit folgender Anfrage lassen wir von unserem Server simulierte Aktiendaten für die Unternehmen BMW (BMW.DE) und Daimler (DAI.DE) erzeugen:

http://www.programmierenlernenhq.de/tools/query.php?s=DAI.DE,BMW.DE

Als Antwort erhalten wir die angefragten Finanzdaten im XML-Format, siehe folgende Abbildung:

android xml daten

Angefragte Aktiendaten für BMW und Daimler im XML-Format

In unserer App werden wir die Anfrage-URL nachbauen, mit weiteren Symbolen (Kennungen von Unternehmen) ergänzen und anschließend mittels HttpURLConnection eine Verbindung zu unserem Server aufbauen.

2. Erlaubnis für den Internetzugriff in Android einholen

Ein wichtiger Designansatz der Sicherheitsarchitektur von Android ist, dass keine Anwendung die Erlaubnis besitzt, schadhafte Operationen auf andere Anwendungen, das Betriebssystem oder den Benutzer auszuführen. Dies beinhaltet Aktionen wie:

  • Lesen oder Überschreiben der privaten Benutzerdaten (Kontakte, E-Mails…)
  • Lesen oder Überschreiben der Dateien anderer Anwendungen
  • Netzwerkzugriffe ausführen
  • Wach halten des Android Geräts

Jede Android App wird dadurch in einer Prozess Sandbox, ein isolierter Bereich, innerhalb dessen jede Maßnahme keinerlei Auswirkung auf die äußere Umgebung hat, ausgeführt. Möchte eine App zusätzliche Fähigkeiten erlangen, muss sie dafür um Erlaubnis fragen.

Android Apps erklären statisch welche Genehmigungen sie benötigen. Das Android System teilt dem Nutzer dies bei der Installation der App mit. Der Nutzer muss diese Genehmigungen erteilen, wenn er die Anwendung nutzen möchte.

Eine dynamische Erlaubnisvergabe zur Laufzeit ist in dem Android System nicht zu finden, da sie die Benutzererfahrung verschlechtern würde. Eine sehr detaillierte Beschreibung dieses Sicherheitskonzepts findet ihr unter: http://developer.android.com/guide/topics/security/permissions.html.

Zur Info: Seit Android 6.0 erfolgt die Erlaubnisvergabe dynamisch. Detaillierte Informationen über den neuen Vergabeprozess könnt ihr hier finden.

2.1 Genehmigung (Erlaubnis) für geschützte Funktionen einholen

Eine einfache Android Anwendung besitzt standardmäßig keine mit ihr verbundenen Genehmigungen. Sie kann somit keinen Schaden auf das Benutzererlebnis oder die Gerätedaten verursachen. Um die geschützten Funktionen eines Android Geräts nutzen zu können, müssen diese einzeln in der AndroidManifest.xml beantragt werden. Es muss um Erlaubnis gebeten werden, diese nutzen zu dürfen.

Mit Hilfe der <uses-permission>-Tags wird gezielt erklärt, welche geschützten Funktionen von der App genutzt werden müssen, damit die Anwendung ihre Arbeit verrichten kann.

Eine App, die eingehende SMS überwachen muss, würde um folgende Genehmigung bitten:


Wenn eine App installiert wird, sorgt der Package Installer dafür, dass sie die benötigten Genehmigungen erhält. Dies geschieht nicht automatisch, sondern muss von dem Benutzer bestätigt werden. Werden die angefragten Genehmigungen nicht erteilt, kann die App nicht installiert werden.

Android stellt eine große Menge an Genehmigungen zur Verfügung, die in Manifest.permission definiert sind. Eine Übersicht über die möglichen Genehmigungen des Android Systems, zusammen mit jeweils einer kurzen Erklärung, findet ihr hier: http://developer.android.com/reference/android/Manifest.permission.html

2.2 Genehmigung für den Internetzugriff anfordern

Unsere Android App soll Online-Aktiendaten abfragen, daher benötigt sie den Zugriff auf das Internet. Mit der folgenden Codezeile bitten wir um die Erlaubnis, auf das Internet zugreifen zu dürfen. Wird uns diese vom Anwender erteilt, erhält unsere App die Erlaubnis network sockets zu öffnen.


Die obere Codezeile fügen wir in unser Android Projekt in die Datei AndroidManifest.xml ein. In Android Studio sieht der gesamte Quellcode dann folgendermaßen aus:

android internet permission

Die Datei AndroidManifest.xml mit Angabe der android.permission.INTERNET

Das war auch schon alles. Mit dieser kleinen Änderung haben wir um die Zugriffserlaubnis auf das Internet gebeten. Wenn bei der Installation unserer Anwendung der Benutzer die Erlaubnis erteilt, wird die App in der Lage sein auf das Internet zuzugreifen.

3. Aktiendaten in dem asynchronen Task online abfragen

Da wir jetzt die Zugriffserlaubnis für Internetabfragen besitzen, kann die online Anfrage an den Web-Server von unserer App heraus erfolgen.

Die Anfrage darf aber nicht im UI-Thread ausgeführt werden, sondern muss in einem Nebenthread stattfinden.

Daher muss der Quellcode, der die Anfrage ausführt, in die innere Klasse HoleDatenTask gelagert werden.

Die Klasse HoleDatenTask ist von der Klasse AsyncTask abgeleitet, wodurch alle Anweisungen, die in der überschriebenen Methode doInBackground angegeben sind, in einem eigenen Arbeitsthread ausgeführt werden. Daher muss unsere Abfrage der Online-Finanzdaten genau in dieser Methode stattfinden. Den Quellcode dazu haben wir unten angegeben.

Der unten angegebene Quellcode der doInBackground-Methode muss in die innere Klasse HoleDatenTask der Klasse AktienlisteFragment eingefügt werden. Und zwar muss durch ihn die bereits vorliegende Methode doInBackground ersetzt werden.

Zusätzlich müssen die folgenden Import-Anweisungen im Quellcode ganz oben in der Klasse AktienlisteFragment eingefügt werden:


Die folgende Datei enthält den gesamten Quellcode der Klasse AktienlisteFragment zur Übersicht:

AktienlisteFragment.java (als ZIP-Datei gepackt)

Jetzt folgt der Quellcode der doInBackground-Methode, mit dem die Abfrage der Online-Aktiendaten erfolgt:


Wir werden hier nur kurz auf den Quelltext eingehen und sehr einfach beschreiben, was die verschiedenen Anweisungen bewirken.

In Zeile 8 ist der Anfrage-String beispielhaft in seiner ursprünglichen Form angegeben. Diesen String werden wird nachbauen und an einer Stelle eine Variable einfügen, damit wir später gezielt Aktiendaten anfragen können.

Mit den Zeilen 11 bis 16 bauen wir den Anfrage-String anfrageString zusammen. Dieser besteht aus statischen und dynamischen Teilstücken.

Das statische Teilstück:

  • URL_PARAMETER: Die Basis-URL zu unserem Web-Server.

Das dynamische Teilstück:

  • symbols – Enthält die Liste der Finanzinstrumente (Aktien, Indizes, …), für die wir die Finanzdaten abfragen möchten.

Mit der Zeile 18 loggen wir den zusammengesetzten Anfrage-String als verbose-Meldung. Somit können wir in Android Studio den String mittels Logging schnell überprüfen.

In dem äußeren try-Block von Zeile 27 bis 64 führen wir den HTTP Request durch. Dazu erzeugen wir aus dem zusammengesetzten Anfrage-String eine URL und bauen anschließend eine HttpURLConnection darauf auf.

Die zurückgelieferten Aktiendaten lesen wir mittels InputStream und BufferedReader aus. Die Daten speichern wir in dem String aktiendatenXmlString ab. Sie sind in dem XML-Format abgelegt und müssen später von uns gezielt ausgelesen werden.

Das XML-Format (Extensible Markup Language) eignet sich hervorragend für den schnellen Datenaustausch zwischen Anwendungen.

In Zeile 47 loggen wir die erhaltenen XML-Aktiendaten als verbose-Meldung mit und geben in Zeile 48 den Arbeitsfortschritt bekannt. In den restlichen Zeilen Code wird Fehlerbehandlung betrieben, sowie die HttpURLConnection und der BufferedReader geschlossen.

4. Testen unserer Android App und Kontrollieren der erhaltenen Aktiendaten in der Log-Meldung

Jetzt ist es endlich soweit, wir greifen mit unserer Android App das erste Mal auf echte Aktiendaten über das Internet zu.

Damit wir unsere App auf dem Smartphone oder Tablet starten können, müssen alle Schritte von Teil 3 des Android Tutorials befolgt worden sein.

Zuerst schließen wir unser Android Gerät an den PC an und stellen eine Verbindung über die ADB (Android Debug Bridge) her. Danach klicken wir auf das Run 'app'-Symbol. Unser Android Projekt wird dadurch neu erstellt und auf dem angeschlossenen Gerät ausgeführt.

Das Run 'app'-Symbol befindet sich in der oberen Menüleiste, siehe folgende Abbildung:

android studio project avd run

Android App über das Run App-Symbol starten

Nach einigen Momenten öffnet sich der Select Deployment Target-Dialog. In ihm nehmen wir die folgenden Einstellungen vor:

  1. Das angeschlossene Android Gerät unter Connected Devices auswählen.
  2. Mit einem Klick auf den OK-Button die Installation unserer App auf das Gerät starten.
android device run app

Auswählen des angeschlossenen Android Geräts zum Aufspielen unserer App

Der Dialog schließt sich und unsere Android App wird auf das angeschlossene Gerät übertragen und installiert. Die Installation dauert nur einen kurzen Augenblick und verläuft fast unbemerkt im Hintergrund. Danach wird unsere App automatisch gestartet.

4.1 Die Log-Meldungen mit LogCat im Terminal überwachen

Dazu öffnen wir den Terminal mit einem Klick auf den Text Terminal in der unteren Leiste von Android Studio. In dem Terminal navigieren wir in das sdk\platform-tools-Verzeichnis und geben den folgenden ADB-Befehl ein:

adb logcat AktienlisteFragment:v HoleDatenTask:v *:s

Mit dem oberen Befehl werden uns Log-Meldungen ab Stufe verbose angezeigt, die einen der beiden Tags AktienlisteFragment oder HoleDatenTask verwenden. Alle anderen Log-Meldungen werden durch den Filter *:s geblockt, wobei s für silent steht.

Nachdem wir den Befehl (Markierung 1) eingegeben und mit Enter bestätigt haben, werden uns folgende Meldungen (Markierung A) im Terminal angezeigt:

android logcat

Log-Meldungen in Android Studio nachdem unsere App gestartet wurde

Jetzt klicken wir in unserer App auf den Aktualisieren-Button im Overflow Menu. Dadurch wird der asynchrone Task HoleDatenTask gestartet und die Methode doInBackground ausgeführt.

In der Methode wird zuerst der Anfrage-String zusammengesetzt und anschließend daraus eine URL erzeugt, über die eine HttpURLConnection aufgebaut wird. Als Ergebnis erhalten wir die angefragten Aktiendaten von unserem Web-Server zurück in Form eines XML-Strings.

Nachdem wir auf den Aktualisieren-Button geklickt haben, erhalten wir folgende Log-Meldung:

android log xml

Ausgabe des Anfrage-Strings und der erhaltenen XML-Aktiendaten

Und wie wir sehen können, haben wir einen korrekten Anfrage-String zusammengesetzt (Markierung A) und erhalten die Finanzdaten für die Finanzinstrumente BMW.DE und DAI.DE als XML-String zurück.

Auf dem Display des Android Geräts bekommen wir die Finanzdaten noch nicht angezeigt. Diese Funktion werden wir erst in der nächsten Lektion des Android Tutorials implementieren, wenn wir den XML-String parsen (auslesen) und die erhaltenen Finanzinformationen auf dem Display ausgeben.

Nun möchten wir noch die Log-Meldungen mit dem Dalvik Debug Monitor Server (DDMS) überwachen.

4.2 Die Log-Meldungen mit dem Dalvik Debug Monitor Server (DDMS) überwachen

Wir starten den DDMS wie in Teil 5 des Android Tutorials beschrieben. Dabei ist unser Android Gerät angeschlossen und auch unsere App läuft bereits.

Jetzt klicken wir auf den Aktualisieren-Button und fragen erneut Aktiendaten online ab. In dem DDMS erhalten wir folgende Log-Meldungen angezeigt:

android ddms log

Anfrage-String und erhaltene XML Aktiendaten in DDMS betrachten

Um die Log-Meldungen so wie in der Abbildung angezeigt zu bekommen, müssen folgende Schritte ausgeführt werden:

  1. Als Erstes klicken wir auf unsere App, um die Log-Meldungen für das angeschlossene Android Gerät betrachten zu können.
  2. In der Suchleiste tag:AktienlisteFragment|HoleDatenTask eingeben, um nur Log-Meldungen mit diesen beiden Tags anzuzeigen.
  3. Einstellung des Prioritäts-Level. Wir lassen verbose ausgewählt, wodurch alle Log-Meldungen ab Stufe verbose ausgegeben werden.

Der grüne Rahmen (A) umschließen die Prozess-ID (10302). Der violette Rahmen (B) umschließen die Thread-ID (10302 bzw. 11148).

Wie zu erkennen ist, unterscheiden sich die beiden IDs zeitweise. Dies muss so sein, da der asynchrone Task in einem eigenen Arbeitsthread mit der ID (11148) ausgeführt wird. Der UI-Thread (Main-Thread) besitzt als Prozess- und Thread-ID jeweils die gleiche ID (10302).

Unseren zusammengesetzten Anfrage-String haben wir mit einem blauen Rahmen markiert (C) und direkt darunter sind die übertragenen XML-Aktiendaten von einem orangen Viereck umrahmt (D).

Außerdem können wir uns in DDMS auch die Netzwerkaktivitäten anzeigen lassen. Im oberen Diagramm ist der Netzwerkverkehr dargestellt. Er besteht aus gesendeten und empfangenen Datenpaketen.

Auch im DDMS konnten wir den Anfrage-String und die erhaltenen Aktiendaten mit Hilfe der Log-Meldungen schnell überprüfen. Unsere App funktioniert so, wie sie es soll, wobei bisher die Aktiendaten nur als Log-Meldungen ausgegeben werden.

Um dies zu ändern, werden wir in dem nächsten Teil des Android Tutorials die erhaltenen XML-Aktiendaten weiterverarbeiten und in dem bereits erstellten ListView anzeigen lassen.

Zusammenfassung

In diesem Teil unseres großen Android Tutorials haben wir simulierte Finanzdaten über einen Web-Server angefragt und anschließend in unserer App weiterverarbeitet.

Damit unsere Android Anwendung auf das Internet zugreifen durfte, mussten wir uns vom Android System und dem User vorher die Erlaubnis dafür einholen. Dies haben wir mit einer kleinen Änderung in der AndroidManifest.xml-Datei getan und dabei die Sicherheitsarchitektur von Android kennengelernt.

Mit der Erlaubnis Internetzugriffe aus der App heraus auszuführen, konnten wir eine Verbindung unserem Web-Server aufbauen und uns mit einer speziellen Anfrage-URL die Finanzdaten für Aktien liefern lassen.

Die gelieferten Aktiendaten, ein XML-String, haben wir mit Hilfe des Logging-Systems von Android überprüft. Dafür wurde der Terminal (Konsole) von Android Studio und auch der Dalvik Debug Monitor Server (DDMS) verwendet.

In dem nächsten Teil unseres Android Tutorials werden wir die Aktiendaten weiterverarbeiten, indem wir den XML-String zerlegen und bestimmte Finanzinformationen in dem ListView unserer App und somit auch auf dem Display unseres Android Geräts anzeigen.


Comments 36

  1. Pingback: Android Tutorial: Hintergrundberechnungen mit AsyncTask

  2. Pingback: Android Tutorial: XML Daten auslesen und anzeigen in Android

  3. hi,
    habe die Anfrage genau so ausprobiert, funktioniert leider nicht. Habe mir die neue URL selbst zusammen gebaut: “https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20csv%20where%20url%3D’http%3A%2F%2Fdownload.finance.yahoo.com
    %2Fd%2Fquotes.csv%3Fs%3DBMW.DE%2CDAI.DE%26f%3Dsnc4xl1d1t1c1p2ohgv%26e%3D.csv’
    %20and%20columns%3D’symbol%2Cname%2Ccurrency%2Cexchange%2Cprice%2Cdate
    %2Ctime%2Cchange%2Cpercent%2Copen%2Chigh%2Clow%2Cvolume’
    &format=xml&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys”

    mit der kriege ich raten im browser und in der app, aber was mit parsen funktioniert jetzt nicht mehr richtig, Daten werden auf dem device nicht mehr richtig angezeigt.
    Was ist zu tun?

    1. Post
      Author

      Hallo Soraya,

      schwer zu sagen ohne Quellcode. Wenn du möchtest, kannst du mir deine Projektdateien per E-Mail zusenden. Ich werde dann mal drüber schauen, vielleicht kann ich den Fehler finden. Die E-Mail Adresse kannst du im Impressum nachschauen.

      Viele Grüße, Chris

      1. Wie würdest du denn die neue url parsen?
        Denn ich glaube die alte ist einfach nicht mehr aktuell und ich habe dass mit dem parsen noch nicht so verstanden.

        1. Post
          Author

          Hallo Soraya,

          die URL aus dem Tutorial ist aktuell. Ich habe die URL gestern getestet, bevor ich auf deinen Kommentar geantwortet habe. Auch in der App funktioniert die URL so wie im Beitrag beschrieben. Daher vermute ich den Fehler in deinem Quellcode.

          Viele Grüße, Chris

          1. Wenn ich die URL aus dem gelben Kommentar in den Browser eingebe bekomme ich eine error Meldung zurück.

            Wenn du sagst dass sie aktuell ist, wie benutze ich sie dann richtig?

          2. Post
            Author
  4. Leider wird seit diesem Abschnitt meine App immer angehalten sobald ich auf aktualisieren drücke. Habe mich sehr viel damit beschäftigt zu versuchen den Fehler zu finden.
    Leider ohne erfolg.
    Wurde mich sehr interessieren was ich falsch gemacht habe.
    Vieleicht hast du ja eine idee.
    Hatte auch erstmal weiter gemacht.

    Vielen dank

    1. Post
      Author

      Hallo Mark,

      schwer zu sagen ohne Quellcode. Es könnte ein Tippfehler in Deinem Quellcode sein. Tippfehler schleichen sich schnell ein. Wenn Du möchtest, kannst Du mir Deine Projektdateien als ZIP per E-Mail zusenden. Ich werde dann mal drüber schauen, vielleicht kann ich den Fehler finden. Die E-Mail Adresse kannst Du im Impressum nachschauen.

      Viele Grüße, Chris

  5. Hi Chris,

    mir ist gerade die nette Überschrift zum 4. Abschnitt aufgefallen – ob Yahoo-Finance wirklich Wetterdaten preis gibt? Da musste ich doch schmunzeln. War dies hier mal ein Wetterdaten-Projekt? Wo kann man denn Wetterdaten herunter laden?

    Gruß, Reinhard

    1. Post
      Author

      Hallo Reinhard,

      danke für den Hinweis. Ich habe den Fehler eben korrigiert.

      Ja, früher war das Android Tutorial ein Wetterdaten-Projekt. Die App hieß WetterHQ und war eine einfache Wetter-App. Die Wetterdaten hatten wir damals von http://openweathermap.org/ über deren API abgefragt.

      Viele Grüße, Chris

  6. Die Seiten gefallen mir echt gut. Das Toutorial habe ich bis Teil 8 durchgearbeitet.
    Leider stürzt das Programm bei Zeile 51 ab. (InputStream inputStream = httpURLConnection.getInputStream();)

    Das Programm geht auch nicht in den Catch Block.
    Woran liegt das?
    den Inhalt von httpURLConnection steht hier:
    libcore.net.http.HttpsURLConnectionImpl$HttpUrlConnectionDelegate:
    https://query.yahooapis.com/v1/public/yql?q=
    select%20*%20from%20csv%20where%20url=
    ‘http://download.finance.yahoo.com/d/quotes.csv?s=
    BMW.DE,DAI.DE,%255EGDAXI%26f=snc4xl1d1t1c1p2ohgv%26e=
    .csv’%20and%20columns=’symbol,name,currency,exchange,price,date,
    time,change,percent,open,high,low,volume’&diagnostics=true

    1. Post
      Author

      Hallo Paul,

      hmmm, schwierig zu sagen warum es abstürzt ohne Quellcode.

      Wenn Du möchtest, kannst Du mir Deine Projektdateien als ZIP per E-Mail zusenden. Ich werde dann mal drüber schauen, vielleicht kann ich den Fehler finden. Die E-Mail Adresse kannst Du im Impressum finden.

      Viele Grüße, Chris

  7. Guten Abend Chris,

    da ich wahrscheinlich dasselbe Problem habe wie Paul, wäre es hilfreich,
    wenn die dortige Lösung gleich allgemein veröffentlicht würde.

    Gruß
    joe

    1. Post
      Author

      Hallo Joe,

      bei Paul lag es an dem “uses-permission”-Tag in der AndroidManifest.xml Datei. Dieser Tag war nicht in der obersten Ebene angegeben.

      Hier ist das Video, dass ich für Paul erstellt hatte: Link zum Hilfe-Video

      Vielleicht hilft es Dir etwas weiter.

      Viele Grüße, Chris

      1. Hallo,

        ich habe das selbe Problem, an dem AndroidManifest.xml liegt es allerdings nicht. Hier ist alles so wie im Tutorial.

        Bei mir erscheint folgender Logtext:

        W/InputEventReceiver: Attempted to finish an input event but the input event receiver has already been disposed.
        V/RenderScript: Application requested CPU execution
        V/RenderScript: 0xaec0ca00 Launching thread(s), CPUs 4
        E/HoleDatenTask: Error
        java.io.FileNotFoundException: https://query.yahooapis.com/v1/public/yql?
        q=select%20*%20from%20csv%20where%20
        url=’http://download.finance.yahoo.com/d/quotes.csv?
        s=BMW.DE%26f=snc4xl1d1t1c1p2ohgv%26e=.csv’%20and%20
        columns=’symbol,name,currency,exchange,price,date,time,change,
        percent,open,high,low,volume’&diagnostics=true

        Habe gerade nur BMW.DE drin, aber daran wird es ja nicht liegen.

        Vielen Dank schonmal für die Hilfe 🙂

        Gruß Benny

        1. Post
          Author

          Hallo Benny,

          an BMW.DE liegt es, wie du schon sagst, nicht. Wenn du möchtest, kannst Du mir deine Projektdateien (den ganzen Android Studio Projektordner, aber OHNE die build-Unterordner) als ZIP per E-Mail zusenden. Die E-Mail Adresse kannst Du im Impressum finden. Ich schaue dann mal, ob ich etwas herausfinden kann.

          Viele Grüße, Chris

  8. Hallo zusammen,

    danke für das tolle Tutorial, sehr aufschlussreich. Jetzt bin ich allerdings an einer Stelle wo ich mir nicht mehr ganz sicher bin. Ich habe alles von oben durchgeführt, allerdings verändern sich die Daten auf dem UI nicht nachdem ich die App abspiele, woran liegt es? Bzw. welche Informationen benötigt Ihr, um mir zu sagen woran es liegt?

    Gruß
    Viktor

    1. Post
      Author

      Hallo Viktor,

      schwer zu sagen, woran es liegt. Wenn Du möchtest, kannst Du mir Deine Projektdateien (den ganzen Android Studio Projektordner) als ZIP per E-Mail zusenden. Die E-Mail Adresse kannst Du im Impressum finden. Ich schaue dann mal, ob ich den Fehler finden kann.

      Viele Grüße, Chris

  9. Hi Chris,
    ich hätte da mal eine Frage:
    Die XML-Datei, die ich in meiner App auslesen möchte wird durch eine .htaccess-Datei mit Benutzernamen und Passwort geschützt. Ich besitze die Zugangsdaten und kann die Datei auch über den Browser aufrufen. Aber wie mache ich das nun in Android Studio? Ich habe es schon nach dem Muster

    URL url = new URL(“http://benutzername:passwort@domain.de/abc/datei.xml”)

    probiert, was ebenfalls im Browser funktioniert. In Android Studio wirft das aber eine FileNotFoundException.

    Grüße
    Sebastian

    1. Post
      Author
  10. Hallo Chris,
    ich bekomme seit dem 3.Teil jedesmal wenn ich in der App “Aktualisiere” eine Fehlermeldung über einen unbekannten Buffer. Als ich heute Morgen weiter machen wollte, (Ich habe AS und den Emulator frisch gestartet) hat sich das Problem anscheinend exponentiell erweitert, da ich inzwischen mehrere Meldungen bekomme:

    09-22 07:36:05.094 2737-2815/de.programmierenlernenhq.aktiehq.app E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7f4a13c627a0
    09-22 07:36:06.685 2737-2815/de.programmierenlernenhq.aktiehq.app E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7f4a13c61f50
    09-22 07:36:09.213 2737-2815/de.programmierenlernenhq.aktiehq.app E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7f4a13c61000

    Irgendwelche Ideen woran das liegen könnte?
    App funktioniert bisher genauso wie sie funktionieren soll, das ist nicht das Problem, aber es macht mich stutzig das die ganze Zeit ein bufferproblem herscht und jetzt mehrere.

    Lg Stormy

    1. Post
      Author

      Hallo Stormy,

      OK, eine solche Fehlermeldung habe ich selbst noch nicht erhalten. Wenn du möchtest kann ich mal dein Android Projekt bei mir laufen lassen und schauen, ob das Problem auch auf meinem System auftritt. Ich würde dafür die Projektdateien als Zip per E-Mail benötigen. Die E-Mail Adresse steht im Impressum.

      Haben eventuell andere Leser auch eine solche Fehlermeldung angezeigt bekommen?

      Viele Grüße, Chris

    2. Post
      Author

      Hallo Stormy,

      das Problem mit dem unbekannten Buffer tritt bei Android 6.0 (Marshmallow) auf. In der Version Android 6.0.1 sollte dieser Fehler behoben worden sein, wobei ich da meine Zweifel habe.

      Zu dem Thema habe ich folgende interessante Links finden können:

      StackOverflow: Unknown Buffer
      StackOverflow: Unknown Buffer in Marshmallow
      Google Code: Unknown Buffor Issue

      Auf meinem Entwicklungsgerät Samsung S4 Mini tritt der Unknown Buffer Error nicht auf. Dort läuft aber auch Android 4. Auf dem Android Virtual Device im Emulator trat der Fehler auf. Dort habe ich Android 6.0 laufen.

      Viele Grüße, Chris

  11. Hallo Chris,

    ich habe heute diesen Teil des Tutorial durchgearbeitet und entsprechend im Dokument angepasst.
    Bei mir werden allerdings, wenn ich in der App aktualisiere (Punkt 4.1 nach dem 1.Bild) weiterhin die Mock-Daten angezeigt. In der Konsole kommen, wie von die gesagt, die entsprechenden Daten rein.

    Soll das in diesem Stadium der Entwicklung so sein, oder liegt evtl ein Fehler in meinem Quelltext vor?

    Lg
    Stormy

    1. ok, gerade selber herausgefunden…
      In der nächsten Lektion Abschnitt 2 der letzte Satz:
      “Im nächsten Abschnitt werden wir den XML-String parsen (auslesen) und die erhaltenen Finanzinformationen auf dem Display ausgeben.”
      Diese Information wäre wirklich hilfreich gewesen, damit man weiß das man alles richtig gemacht hat.

      1. Post
        Author

        Hallo Stormy,

        danke für den Hinweis. Ich habe die relevanten Stellen in Teil 8 entsprechend überarbeitet, so dass es jetzt hoffentlich klarer für die Leser ist.

        Viele Grüße, Chris

  12. Hi Chris,

    erstmal vielen Dank für deine Tutorialreihe. Ich bekomme wohl bei

    InputStream inputStream = httpURLConnection.getInputStream();

    einen Fehler. Ich weiß nicht wie ich weiter vorgehen soll, es handelt sich um einen Verbindungsfehler (Connection timed out).

    Hoffentlich kannst du mir weiterhelfen.

    Habe dir eine Mail geschickt mit den Projektdaten.

    1. Post
      Author

      Hallo Waldemar,

      deine Mail habe ich erhalten. Ich werde mal schauen, ob ich den Fehler finden kann.

      Viele Grüße, Chris

        1. Post
          Author

          Hallo Waldemar,

          sorry das ich nicht schneller helfen kann. In letzer Zeit komme ich kaum dazu Lesern zu helfen. Ich habe mir dein Projekt schon angesehen, aber noch einen Konflikt mit meiner Android Studio Installation (ich benutze eine zu alte Version und muss daher noch updaten). Bis Sonntag sollte ich mit etwas Glück den Fehler gefunden haben. Ich geb dir dann über den Status Bescheid.

          Viele Grüße, Chris

  13. Hi,
    Habe ein Projekt vor weis aber nicht genau wie ich meinen Quellcode schreiben soll. Können Sie mir helfen?

    1. Post
      Author

      Hallo Andreas,

      wenn du möchtest, kannst du mir per E-Mail dein Projekt grob umschreiben. Eventuell kann ich dir ein paar Tipps geben. Die E-Mail Adresse kannst Du im Impressum finden.

      Viele Grüße, Chris

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.