2016-05-02 9 views
-3

Ich versuche, die Breite und Höhe eines Bildes zu erhalten, um es zu rezizieren, falls es zu groß ist, bevor es angezeigt wird. Meine Methode empfängt eine Uri des Bildes, aber ich bekomme immer eine FileNotFoundException, wenn ich versuche, sie mit BitmapFactory zu entschlüsseln. HierAndroid: FileNotFoundException beim Versuch, ein Bild von Uri

ist eine Probe von meinem Code:

Uri myUri; 

    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(new File(myUri.getPath()).getAbsolutePath(), options); 

    int imageHeight = options.outHeight; 
    int imageWidth = options.outWidth; 

Decode Datei kehrt wirft ein FileNotFoundException hier. Allerdings kann ich zeigen noch das Bild mit der uri ohne eine Bitmap-Fabrik mit diesem mit:

 Uri myUri; 

     Bitmap myBitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), myUri); 

Das Problem mit diesem Code ist, dass das zurückgegebene Bitmap möglicherweise eine OutOfMemoryError verursachen, wenn große Bilder verwenden.

Wenn ich meine Uri debuggen, bekomme ich diese:

Inhalt: //com.android.providers.media.documents/document/image%3A20472

UPDATE || Hier ist der Arbeitscode

Uri myUri; 

    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 

    // This is the part that changed 
    InputStream inputStream = context.getApplicationContext().getContentResolver().openInputStream(myUri); 
    BitmapFactory.decodeStream(inputStream,new Rect(),options); 

    int imageHeight = options.outHeight; 
    int imageWidth = options.outWidth; 

All dies natürlich von Versuch/Fang umgeben.

+0

Es ist eine Weile her, seit ich mit Android gespielt habe, aber da es eine FileNotFoundException ist, haben Sie versucht, "new File (myUri.getPath()). GetAbsolutePath()" zu überprüfen, welcher Wert genau zurückgibt? Da könnte etwas komisches vor sich gehen. – hennign

+0

Benötigen Sie weitere Informationen zu myUri? Ich kann nicht herausfinden, was Inhalt: //com.android.providers.media.documents/document/image%3A20472 in diesem Zusammenhang bedeutet. – hennign

Antwort

0

Verwenden Sie decodeStream statt decodeFile.

Öffnen Sie den Stream mit getContentResolver().openInputStream(myUri).

+0

Das war in der Tat das Problem, Danke. Ich habe die Frage aktualisiert, um das resultierende Stück Code zu geben. – Sprawl

0

Nachdem ich eine Zeit lang damit herumgespielt habe, ist das Problem wahrscheinlich, dass die Bilddatei wirklich nicht da ist.

Wenn Sie versuchen, auf eine lokale Datei auf Ihrem Computer zuzugreifen, befindet sich diese Datei nicht in der Android-Sandbox, in der die App ausgeführt wird. Sie müssen es der App als Ressource hinzufügen und dann als Ressource anstelle einer Datei darauf zugreifen.

Wenn Sie versuchen, auf ein Web-Image zuzugreifen, müssen Sie es zuerst herunterladen. Der AbsolutePath eines Web-Bildes 'http://example.com/example.jpg' wäre '/example.jpg', was Ihnen nicht viel Gutes bringt, wenn Sie versuchen, es zu öffnen.

+0

Ich teste auf einem tatsächlichen Android-Gerät, nicht die Sandbox. Um mehr Kontext zu geben, wird der Benutzer aufgefordert, ein Bild von seinem Gerät zu wählen. In der Methode "onActivityResult", die aufgerufen wird, nachdem der Benutzer sein Bild ausgewählt hat, wird die uri unter Verwendung der Daten in der als Parameter übergebenen Absicht erstellt. Die URI ist definiert wie folgt: public void onActivityResult (int requestCode, int Resultcode, Absichtsdaten) { Uri myUri = data.getData(); ...} – Sprawl

Verwandte Themen