Bilder Download - Geschwindigkeit

  • Antworten:5
Alex K
  • Forum-Beiträge: 22

22.07.2011, 09:47:53 via Website

Hey,
ich lade mit meiner App Bilder von meiner Website herunter.
Das Runterladen der Bilder dauert relativ lange und wirft mir auch bei jedem Bild eine Warnung:
1WARN/MediaProvider(206): original file hasn't been stored yet: [bild]

Vielleicht habt ihr ja einen Tipp für mich wie ich den Download beschleunigen kann und diese Warnung weg bekomme. :)


Mithilfe folgender Funktion lade ich Bilder von meiner Website.
1int length = connection.getContentLength();
2 InputStream is = (InputStream) url.getContent();
3
4 byte[] imageData = new byte[length];
5 int buffersize = (int) Math.ceil(length / (double) 100);
6 int downloaded = 0;
7 int read;
8
9 while (downloaded < length) {
10 if (length < buffersize) {
11 read = is.read(imageData, downloaded, length);
12 } else if ((length - downloaded) <= buffersize) {
13 read = is.read(imageData, downloaded, length
14 - downloaded);
15 } else {
16 read = is.read(imageData, downloaded, buffersize);
17 }
18
19 downloaded += read;
20 publishProgress(i, countPaths, (downloaded * 100) / length);
21 }
22
23 Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0,
24 length);

Abgespeichert werden die Bilder hiermit:
1String filename = name;
2 ContentValues values = new ContentValues();
3 File sdImageMainDirectory = new File(Environment
4 .getExternalStorageDirectory(), getResources().getString(
5 R.string.directory));
6
7 sdImageMainDirectory.mkdirs();
8
9 File outputFile = new File(sdImageMainDirectory, filename);
10 values.put(MediaColumns.DATA, outputFile.toString());
11 values.put(MediaColumns.TITLE, filename);
12 values.put(MediaColumns.DATE_ADDED, System
13 .currentTimeMillis());
14 values.put(MediaColumns.MIME_TYPE, "image/png");
15
16 Uri uri = this.getContentResolver().insert(
17 MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
18
19 try {
20 OutputStream outStream = this.getContentResolver()
21 .openOutputStream(uri);
22 bitmap.compress(Bitmap.CompressFormat.PNG, 95, outStream);
23
24 outStream.flush();
25 outStream.close();
26
27 } catch (FileNotFoundException e) {e.printStackTrace();}
28 catch (IOException e) {e.printStackTrace();}
29 }


Viele Grüße,
Alex

— geändert am 22.07.2011, 09:48:45

Antworten
Gelöschter Account
  • Forum-Beiträge: 281

23.07.2011, 10:45:05 via Website

Es gilt die alte Regel - alle Dinge, die lange dauern, in einem Hintergrund-Thread machen ;-)

Antworten
Alex K
  • Forum-Beiträge: 22

25.07.2011, 08:29:50 via Website

Hey Thomas,
der Download läuft bereits in einem eigenen Thread. :)
Aber vielleicht hat ja jemand eine bessere Methode Bilder runterzuladen.


Viele Grüße,
Alex

Antworten
Harry
  • Forum-Beiträge: 52

25.07.2011, 08:44:53 via Website

Überprüfe mal beim Download, ob das Bild mit den 2 End of Image Bytes (FFD9) endet.
Android ist da sehr empfindlich und kann Bilder ohne diese 2 Bytes nicht öffnen! Ich schließe darauf, weil der MediaProvider ja meckert!
Sollten die Bytes fehlen, einfach hinten dran hängen!

Gruß Harry

Antworten
Alex K
  • Forum-Beiträge: 22

25.07.2011, 09:26:27 via Website

Hallo Harry,
wie kann ich den FFD9 ans ende hinzufügen?

Würde das ganze gern in eine if packen also...
1if(bild kein FFD9)
2 dann hinzufügen
Wie müsste das den in Java aussehen?


Viele Grüße,
Alex

Antworten
Harry
  • Forum-Beiträge: 52

03.08.2011, 10:34:57 via Website

Hallo,
beim Herunterladen speicherst du das Bild ja in einem Bytearray (bei dir imageData). Wenn du alle bytes empfangen hast, einfach die 2 letzten Bytes auslesen.

Das vorletzte sollte dann Hex: 0xFF (Dez: 255) und das letzte Hex: 0xD9 (Dez: 217) sein.
Wenn dem nicht so ist, musst du dir ein neues bytearray erstellen, was 2 byte länger ist. Dort das alte Bytearray rein kopieren und die 2 bytes dahinter schreiben.

Einfacher geht das alles natürlich mit einem ByteArrayOutputStream.

Gruß Harry

Antworten