Java Android: BitmapFactory.decodeStream() gibt null anstatt ein Bitmap zurück

metzgore

Ensign
Registriert
Sep. 2011
Beiträge
179
Hallo an alle,

ich arbeite an einer App in der es unter Anderem möglich ist ein Foto zu machen bzw. ein Foto aus der Gallerie auszuwählen und anzeigen zu lassen. Dazu benutze ich:

Code:
Inputstream in = questionActivity.getContentResolver().openInputStream(data);
Bitmap bm = BitmapFactory.decodeStream(in);
in.close();

Bei data handelt es sich um die URI, unter der das Foto gespeichert ist (z.B. /external/images/media/1822).
Die 3 Zeilen Code funktionieren, wenn ich ein Foto gemacht habe oder ein Foto aus der Gallerie ausgewählt habe (die URI bekomme ich dann über das jeweilige Intent).

Nun möchte ich gern die URI in einem String speichern, um diesen dann via SQLite abspeichern zu können um bei Bedarf aus dem String wieder die URI zu parsen und mit der URI wieder das Foto anzuzeigen.

Den String hole ich mir über uri.getEncodedPath() bzw. uri.getPath(). Das Parsen des Strings zur URI mache ich mit Uri.parse(uriString). Wenn ich jetzt allerdings mit dem aus dem String erzeugten URI-Objekt oben stehende 3 Zeilen Code ausführe, dann bekomme ich nur null, anstatt das Bitmap zurück.

Es hat also den Anschein, als ob nichts unter der angegebenen URI gefunden werden kann. Allerdings ist die geparste URI identisch mit der URI, die ich über das Intent bekomme, wenn ich bspw. ein Foto mit der Kamera-App mache.

Hat jemand eine Idee, was ich hier falsch mache?
 
Hallo, ich kanns nicht mit SIcherheit sagen, aber vielleicht verwirft Android ja die Uris, sobald die aufrufende Activity geschlossen wurde?! Wie gesagt rein Spekulation.
Mein Lösungsgedanke wäre, gleich den Pfad in die DB zu schreiben. Also direkt nachdem du den URI bekommen hast, den Pfad mittels getPath() ermitteln und diesen dann ich die DB schreiben.

Probier doch mal, ob Uri.getPath() nach dem Lesen aus der DB null ist.
 
Das die URIs verworfen werden, könnte prinzipiell sein. Allerdings sollte das in meinem Fall nicht den Fehler verursachen, da alles in einer Activity abläuft und diese zwischendurch nicht geschlossen wird. Momentan befindet sich der Pfad auch noch nur in einem Attribut, da das Abspeichern in der DB noch implementiert werden muss.

Ich lasse mir, kurz bevor ich das Bitmap via Inputstream holen will, den Pfad des URIs außerdem im Logcat anzeigen. Und wie gesagt, dieser Pfad stimmt mit dem Pfad des URIs aus dem Intent überein.

Mir ist eben aufgefallen, das laut Spezifikation getContentResolver().openInputStream() eine FileNotFoundException wirft, falls unter dem URI nichts gefunden wird. Die Exception wird aber nicht geworfen.
 
Zuletzt bearbeitet:
Unter welchem API-Level programmierst du? Ich glaub in API-LEvel 4 oder 7 gabs mal nen Bug bei BitmapFactory.decodeStream(), der dazu führte dass eben diese Methode null zurückgibt.

Ansonsten weiß ich auch nicht wirklich weiter... evtl. mal gucken ob der InputStream null oder leer ist?!
 
Ich programmiere unter Api-Level 10, aber ich habe das Problem gerade lösen können, nachdem ich die Funktionen bisschen umgeschrieben habe.
Fehler war eine "FileNotFoundException: No content provider when decoding stream". Warum diese Exception erst nach dem Umschreiben gekommen ist, ist mir ein Rätsel. Danach nur 1 Sek. Google und ich hatte die Antwort:

Meine Uri /external/images/media/1827 benötigt noch ein content://media davor, was dann ein content://media/external/images/media/1827 ergibt. Und sie da, das Foto wird einwandfrei geladen.
 
Zurück
Oben