Bilder von Website laden

  • Antworten:19
  • Bentwortet
Alex K
  • Forum-Beiträge: 22

09.06.2011, 10:29:16 via Website

Hey,
nachdem ich jetzt alle Artikel meiner Website über JSON bekomme ( :) ) ist mir aufgefallen das meine Bilder fehlen.
In meiner sqlite-Datenbank stehen nur die URLs zu den Bilden (z.B. www.meineSeite.de/daten/bilder/bsp.jpg).

Meine Frage also...
Wie kann ich meine Bilder von der Website laden und auf dem Handy abspeichern?

Vielleicht hat ja jemand schonmal sowas gemacht. Würde mich über Hilfe freuen, google verweigert sie mir nämlich - mal wieder.


Viele Grüße,
Alex

Antworten
Markus B.
  • Forum-Beiträge: 636

09.06.2011, 11:48:10 via Website

Hi,
mir fallen hier drei Wege ein:

1.
Du passt deine Schnittstelle an und lieferst die Bilder via JSON mit aus. Da du kein byte[] via JSON übertragen kannst, musst du das Bild z.B. Base64 Codeieren und dann auf dem Android device wieder decodieren. Dabei wird es wahrscheinlich zu ein bissel over haed bei der codierung kommen aber ich denke das kann man verkraften.

2.
Du parsed beim Anzeigen auf dem Android device die Artikel und lädst die Bilder mit dem httpClient async nach.

3. (Spekulation)
Ich weiß nicht ganau wie du die Artikel anzeigst bzw. ob die Artiel html-Dokumente sind oder plain Text. Sollte es html sein müsste die Webview Componente in der Lage sein die Bilder anzuzeigt.

Gruß,
Markus

Antworten
Alex K
  • Forum-Beiträge: 22

09.06.2011, 14:53:54 via Website

Hallo Markus,
erstmal danke für die Vorschläge.
Vielleicht sollte ich erstmal kurz sagen was ich eigendlich machen möchte.

Ich möchte die Artikel meines Blogs(eigenes Blog-System) komplett offline verfügbar machen - dazu schreibe ich die App.
Die App hollt sich über einen Update-Button alle neuen Artikel(seid dem letzten Update) - aus einer MySql-Datenbank(Bilder nur als Link vorhanden).
Der Update-Button stellt einen http request an den Blog und bekommt einen JSON-String geliefert.
Der String wird geparst und in eine sqlite-Datebank geschrieben.

Gibt es noch andere Möglichkeiten, als die Vorgeschlagenen?


Viele Grüße,
Alex

Antworten
Markus B.
  • Forum-Beiträge: 636

09.06.2011, 15:13:42 via Website

Hi,
sowas habe ich mir schon gedacht. Aber irgendwie müssen die Daten ja vom Webserver aufs Handy kommen.
Was schwebt dir dort denn für eine Lösung vor ?

Gruß,
Markus

Antworten
Alex K
  • Forum-Beiträge: 22

09.06.2011, 15:32:56 via Website

Auf der Client(Android)-Seite hatte ich mir folgendes vorgestellt...

1. auslesen der Bild-URL aus dem JSON-Objekten
2. das Bild mithilfe der URL herunterladen und auf dem Gerät abspeichern(=> Pfad)
3. die Bild-URL in der Datenbank durch den sich aus Punkt 2 ergebenen Pfad ersetzen
4. wieder zu Punkt 1 bis alle Bilder des Objekts geparst, dann zum nächsten Objekt

Da das meine erste App ist, bzw. mein erstes Java "Projekt", weiß ich leider nicht was alles möglich/nicht möglich ist.


Viele Grüße,
Alex


edit: Gerade diesen Link gefunden http://www.dreamincode.net/code/snippet4724.htm . Könnte mir das vllt. helfen?
edit2: Evt. hab ich hier die Lösung... http://stackoverflow.com/questions/5752422/android-download-and-save-more-than-1-image-to-sd-card

— geändert am 09.06.2011, 15:56:17

Antworten
Markus B.
  • Forum-Beiträge: 636

09.06.2011, 16:17:33 via Website

Hi,
hört sich doch gut an. Nur würde ich persönlich die Bilder in der Datenbank ablegen und die ganze DB auf die SD-Karte kopieren.
Wenn du dort irgendwie Hilfe beim Coden brauchst melde dich :)

Gruß,
Markus

— geändert am 09.06.2011, 16:59:09

Antworten
Alex K
  • Forum-Beiträge: 22

10.06.2011, 10:27:49 via Website

Guten Morgen,
allgemein zum Thema Daten auf SD-Karte speichern...
Kann man davon ausgehen das jeder Nutzer eine SD-Karte hat?
Ist es standart solche Daten auf der SD zu speichern?


Habe gerade ein kleines Problem mit meiner Datenbank, vielleicht kannst du mir da helfen.

Ich möchte zusätzlich zu meiner Artikel-Tabelle noch eine Kategorie-Tabelle anlegen.
Bin eigendlich der überzeugung das ich alles richtig gemacht habe...

1private static final String DATABASE_ARTICLE_CREATE =
2 "create table article(_id integer not null, "
3 + "tstamp integer not null, "
4 + "title text not null, "
5 + "bodytext text not null, cat integer not null);";
6
7 private static final String DATABASE_CATEGORY_CREATE =
8 "create table category (_id integer not null, "
9 + "title text not null, tstamp text not null, "
10 + "parent integer not null);";
11
12
13 private final Context context;
14
15 private DatabaseHelper DBHelper;
16 private SQLiteDatabase db;
17
18 public DBAdapter(Context ctx)
19 {
20 this.context = ctx;
21 DBHelper = new DatabaseHelper(context);
22 }
23
24 private static class DatabaseHelper extends SQLiteOpenHelper
25 {
26 DatabaseHelper(Context context)
27 {
28 super(context, DATABASE_NAME, null, DATABASE_VERSION);
29 }
30
31 @Override
32 public void onCreate(SQLiteDatabase db)
33 {
34 db.execSQL(DATABASE_ARTICLE_CREATE);
35 db.execSQL(DATABASE_CATEGORY_CREATE);
36 }
37 @Override
38 public void onUpgrade(SQLiteDatabase db, int oldVersion,
39 int newVersion)
40 {
41 Log.w(TAG, "Upgrading database from version " + oldVersion
42 + " to "
43 + newVersion + ", which will destroy all old data");
44 db.execSQL("DROP TABLE IF EXISTS news");
45 db.execSQL("DROP TABLE IF EXISTS newscat");
46 onCreate(db);
47 }
48 }

Die Tabelle(DATABASE_ARTICLE_CREATE) wird richtig angelegt, kann darauf auch zugreifen, die zweite wird allerdings nicht erzeugt.


Viele Grüße,
Alex


Link: Demo für Datenbank auf SD-Karte http://www.android-hilfe.de/android-codeschnipsel/15376-src-datenank-auf-sd-karte-mit-demo-app.html

Antworten
Johannes Borchardt
  • Forum-Beiträge: 114

10.06.2011, 13:37:26 via Website

Hi Alex,
ich weiß nicht ob Du das gemacht hast, aber ich tippe mal darauf dass dem nicht so ist: Du musst DATABASE_VERSION um eins erhöhen. Wenn Du das machst erkennt Android dass sich an Deinem Datenbankschema etwas geändert hat und führt onUpdate() aus.

Viele Grüße
Johannes

Antworten
Alex K
  • Forum-Beiträge: 22

14.06.2011, 10:50:49 via Website

Hey,
danke für den Hinweis Johannes, das hat funktioniert.

Leider ist jetzt ein neues Problem aufgetretten und ich weiß wircklich nicht woran das liegen könnte.

Folgendes Problem tritt auf...
beim Lesen der JSON-Objekte von der Website wird mir seid kurzem folgedes im Log ausgegeben:
...bei folgender Zeiler (res = client.execute(method);)...
106-14 08:38:55.097: DEBUG/dalvikvm(514): GC_FOR_MALLOC freed 3938 objects / 222096 bytes in 96ms
206-14 08:40:49.598: DEBUG/SntpClient(42): request time failed: java.net.SocketException: Address family not supported by protocol

Freitag hatte noch alles funktioniert, Samstag hatte ich meinen Rechner neu aufgesetzt, am Code habe ich nichts geändert.
Seit dem macht er das nicht mehr richtig - jemand Rat?


Viele Grüße,
Alex


Auslesen des Strings von der Website:
1DefaultHttpClient client = new DefaultHttpClient();
2HttpGet method = new HttpGet(url);
3HttpResponse res = null;
4
5try {
6 res = client.execute(method);
7 }
8 catch (ClientProtocolException e1) {e1.printStackTrace();}
9 catch (IOException e1) {e1.printStackTrace();}
10
11 try {
12 InputStream is = res.getEntity().getContent();
13 BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"));
14 StringBuilder sb = new StringBuilder();
15 String line = null;
16
17 while ((line = reader.readLine()) != null) {
18 sb.append(line);
19 }
20 is.close();
21
22 result = sb.toString();

— geändert am 14.06.2011, 10:54:56

Antworten
Markus B.
  • Forum-Beiträge: 636

14.06.2011, 11:35:23 via Website

Hi,
ich gehe mal davon aus du benutzt Windows als Plattform und evtl. sogar Vista ? :)
Schau mal in deine hosts Datei c:\windows\system32\drivers\etc\hosts.
Wenn dort folgendes steht:
1::1 localhost
Kann dein System localhost nur in eine IPV6 Adresse auflösen und das macht unter Android noch Probleme.


Du kannst das Problemchen nun auch zwei Arten lösen:
1.
1::1 localhost änderst du in 127.0.0.1 localhost
somit löst dein System localhost wieder in eine IPV4 Adresse auf.

2.
Du verwendest im code nicht localhost, sondert entsprechende 127.0.0.1.

Gruß,
Markus

Ps.: Noch was zu deinem Code:

1try {
2 InputStream is = res.getEntity().getContent();
3 BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"));
4 StringBuilder sb = new StringBuilder();
5 String line = null;
6
7 while ((line = reader.readLine()) != null) {
8 sb.append(line);
9 }
10 is.close();
11
12 result = sb.toString();

Kannst du auch so kürzen:

1final HttpEntity entity = response.getEntity();
2final String content = EntityUtils.toString(entity, "ISO-8859-1");

— geändert am 14.06.2011, 11:38:03

Antworten
Alex K
  • Forum-Beiträge: 22

14.06.2011, 12:45:56 via Website

Hallo Markus,
danke für deine Tipps!

Den Code hab ich jetzt gekürzt...
1DefaultHttpClient client = new DefaultHttpClient();
2 HttpGet method = new HttpGet(url);
3 HttpResponse res = null;
4
5 try {
6 res = client.execute(method);
7 }
8 catch (ClientProtocolException e1) {e1.printStackTrace();}
9 catch (IOException e1) {e1.printStackTrace();}
10
11 try {
12 final HttpEntity entity = res.getEntity();
13 final String result = EntityUtils.toString(entity, "ISO-8859-1");

Die Adresse wird richtig in IPv4 aufgelöst, dass war es leider nicht - Proxy und Port in eclipse stimmen auch. =(
Hast du vielleicht noch eine Idee?

Könnte es am Emulator liegen, habe ja eclipse, sdk etc. neu installieren?


Viele Grüße,
Alex



edit:
Habe gerade mal versucht nur 2 Objekte von der Website auszulesen und siehe da... das funktioniert.

Kann es sein das ein Zeichen in meinem JSON-String ist das der DefaultHttpClient nicht mag oder der String zu lang ist?

— geändert am 14.06.2011, 13:26:48

Antworten
Markus B.
  • Forum-Beiträge: 636

14.06.2011, 13:32:56 via Website

Alex K

...
Habe gerade mal versucht nur 2 Objekte von der Website auszulesen und siehe da... das funktioniert.

Kann es sein das ein Zeichen in meinem JSON-String ist das der DefaultHttpClient nicht mag oder der String zu lang ist?

Hi,
das denke ich nicht, da die Excetpion nicht auf ein encoding Problem schließen lässt.
Spontan würde ich einfach sagen das beim Starten des Emulators etwas schief gelaufen ist und somit hattest du nur ein temporäres Problem.

Gruß,
Markus

Antworten
Alex K
  • Forum-Beiträge: 22

15.06.2011, 13:45:31 via Website

Hey,
habe das Problem gelöst. -.-

Er hatte mir ganz unten in meinen String einige Bilder generiert.
...und da JSON ja keine byte[] mag hat er sich immer daran aufgehangen...

Vielen Dank Markus, ohne deine Hilfe würde ich warscheinlich noch min. ne Woche an dem Problem sitzen! :D


Viele Grüße,
Alex

Antworten
Alex K
  • Forum-Beiträge: 22

15.06.2011, 14:44:51 via Website

...zu früh gefreut...
Wieder das selbe Problem... wenn ich nur 2 Objekte auf der Seite habe geht es, sobald ich mehr habe nicht.


Viele Grüße,
Alex



Edit: Gerade mal den Debugger gestoppt... hier bleibt er anscheinen stehen, kann damit aber nichts anfangen.
1OSNetworkSystem.readSocketImpl(FileDescriptor, byte[], int, int, int) line: not available [native method]

— geändert am 15.06.2011, 15:10:05

Antworten
Markus B.
  • Forum-Beiträge: 636

15.06.2011, 17:04:51 via Website

Hi,
dann zeig uns doch mal was du für ein JSON-String vom Server bekommst und wie du diesen genau einließt.
Lad den Code am besten irgendwo hoch, da das kopieren aus dem HTML nur nervt ... :)

Gruß,
Markus

Antworten
Alex K
  • Forum-Beiträge: 22

16.06.2011, 08:40:30 via Website

Hey Markus,
ich hab gestern/heute Nacht nochmal meinen Rechner neu aufgesetzt(64-bit), ging trotzdem nicht.
Habs dann mal auf nem 32-bit System versucht und siehe da, es funktioniert... :)

Nochmals danke für die Hilfe! =)


Viele Grüße,
Alex

Antworten
Markus B.
  • Forum-Beiträge: 636

16.06.2011, 09:10:50 via App

Hi Alex, du hast den Thread zwar schon auf "closed" gesetzt aber ich muss da noch mal meinen Senf zu abgeben :)
Deine Lösung mit der Neuinstallation ergibt für mich keinen Sinn. Ob es nun ein 32 oder 64 Bit System ist bei einer Kommunikation via http egal. Da ist bei dir etwas anderes im Busch (zumindest denke ich das). Ich kann dir nur noch mal anbieten über deine Software zu schauen.

Gruß,
Markus

Antworten
Alex K
  • Forum-Beiträge: 22

16.06.2011, 11:24:32 via Website

Hey Markus,
danke für das Angebot, aber ich will jetzt erstmal selbst mein Glück versuchen - sonst lern ichs ja nie.

Warscheinlich ist was bei der installation der SDK oder Java schief gegangen.
Jetzt läuft es und da bin ich echt froh drüber. :D


Viele Grüße,
Alex

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

18.06.2011, 00:23:00 via App

Alex K
Guten Morgen,
allgemein zum Thema Daten auf SD-Karte speichern...
Kann man davon ausgehen das jeder Nutzer eine SD-Karte hat?
Ist es standart solche Daten auf der SD zu speichern?

Das ist das einzige, wozu ich etwas beitragen kann :D
Ich hab eine App, die eine zip aus dem Netz lädt und auf der SD Karte abspeichert. Nun hab ich das ganze mal auf nem Galaxy Tab 10.1v ausprobiert, das ja keine SD Karte hat. Dann hat Android auf der SD Karte einen Ordner sdcard angelegt, in dem die Daten waren :)
Es gibt aber auch Methoden für sowas (bin mir nicht sicher: getExternalStorage... Irgendwie sowas :)

Antworten
Alex K
  • Forum-Beiträge: 22

20.06.2011, 14:25:19 via Website

Hallo luhu,
danke für den Hinweis! :)

Nur als Ergänzung:
Um die SD zu Prüfen hatte ich folgendes gefunden...
1boolean mExternalStorageAvailable = false;
2 boolean mExternalStorageWriteable = false;
3 String state = Environment.getExternalStorageState();
4
5 if (Environment.MEDIA_MOUNTED.equals(state)) {
6 mExternalStorageAvailable = mExternalStorageWriteable = true;
7
8 Log.v(TAG, "SD Card is available for read and write "
9 + mExternalStorageAvailable + mExternalStorageWriteable);
10 }
11 else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
12 mExternalStorageAvailable = true;
13 mExternalStorageWriteable = false;
14
15 Log.v(TAG, "SD Card is available for read "
16 + mExternalStorageAvailable);
17 }
18 else {
19 mExternalStorageAvailable = mExternalStorageWriteable = false;
20
21 Log.v(TAG, "Please insert a SD Card to save your image "
22 + mExternalStorageAvailable + mExternalStorageWriteable);
23 }
...fand ich sehr hilfreich - den Code habe ich von Link1


Viele Grüße,
Alex

Link1: http://stackoverflow.com/questions/5752422/android-download-and-save-more-than-1-image-to-sd-card

— geändert am 20.06.2011, 14:26:17

Antworten