Ich verwende ACTION_IMAGE_CAPTURE
mit einem vorgegebenen Ziel-Uri, so wie es in der Dokumentation vorgeschlagen wird. Wenn ich jedoch versuche, das Bild sofort zu dekodieren, nachdem meine Aktivität es erhalten hat, schlägt decodeStream()
fehl. Wenn ich es ein paar Sekunden später noch einmal versuche, funktioniert es gut. Ich nehme an, die Datei wird asynchron im Hintergrund geschrieben. Wie kann ich herausfinden, wann es verfügbar ist?Bild mit ACTION_IMAGE_CAPTURE aufgenommen - erster Aufruf von decodeStream schlägt fehl, andere OK
Hier sind die wichtigsten Teile meines Code:
Namen der Zieldatei Bestimmung:
String filename = String.format("pic%d.jpg", new Date().getTime());
File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), filename);
try {
file.createNewFile();
} catch (IOException e) {
file = new File(context.getFilesDir(), filename);
}
targetUri = Uri.fromFile(photoFile);
das Bild aufnehmen:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, targetUri);
fragment.startActivityForResult(takePictureIntent, RESULT_TAKE_PICTURE);
In onActivityResult()
:
if (resultCode == Activity.RESULT_OK) {
if (data != null) {
// Note that data.getData() is null here.
InputStream is = getContentResolver().openInputStream(targetUri);
if (is != null) {
Bitmap bm = BitmapFactory.decodeStream(is);
decodeStream
gibt null zurück. Wenn ich denselben Anruf ein paar Sekunden später erneut mache, ist es erfolgreich. Gibt es irgendetwas, das mir sagt, wenn die Datei verfügbar ist?
UPDATE: greenapps' Vorschlag folgend, ich mache ein decodeStream
Anruf mit inJustDecodeBounds
zunächst die Dimensionen zu bekommen, um zu sehen, ob es sich um ein Speicherproblem ist. Es stellt sich heraus, dass dieser erste Decodierungs-Durchgang nur scheitert, aber jetzt ist der eigentliche decodeStream-Aufruf, der unmittelbar folgt, erfolgreich! Wenn ich dann beides nochmal mache, gelingt es beiden!
So scheint es wie der erste Aufruf an decodeStream
immer scheitert, und alle anderen danach sind gut, auch wenn sie unmittelbar danach auftreten (= innerhalb der gleichen Methode). Es ist also wahrscheinlich kein Problem mit einem asynchronen Schreibvorgang. Aber etwas anderes. Aber was?
targetURI und uri? – greenapps
Wie haben Sie targetUri eingerichtet? Aus einem Dateisystempfad? Verwenden Sie dann decodeFile auf dem ursprünglichen Pfad. – greenapps
'Ich nehme an, die Datei wird asynchron im Hintergrund geschrieben. Ich denke, dass decodeStream wegen Speichermangel null zurückgibt. Einige Zeit später hat sich der GC genug erholt. Versuchen Sie, nur die Grenzen zu decodieren. – greenapps