2016-03-30 18 views
2

Ich werde Anhänge in meiner Android-Anwendung erstellen. Ich muss Bilder anhängen. Hier ist mein Code:Wie bekomme ich eine Bitmap vom Dateimanager?

... 
attachButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
      intent.setType("image/*"); 
      startActivityForResult(Intent.createChooser(intent, "Select image"), CHOOSE_IMAGE); 
     } 
    }); 
... 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == CHOOSE_IMAGE) { 
     if(resultCode == RESULT_OK) { 
      Uri uri = data.getData(); 
      ImageView imageView = new ImageView(this); 

      Bitmap bitmap = getDecodedImageFromUri(uri); 
      imageView.setImageBitmap(bitmap); 
     } 
    } 
} 

private Bitmap getDecodedImageFromUri(Uri uri) { 
    InputStream inputStream = null; 
    try { 
     inputStream = getContentResolver().openInputStream(uri); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    Rect rect = new Rect(0, 0, 0, 0); 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 

    BitmapFactory.decodeStream(inputStream, rect, options); 
    options.inSampleSize = getInSampleSize(options, 128, 128); 

    options.inJustDecodeBounds = false; 
    Bitmap bitmap = BitmapFactory.decodeStream(inputStream, rect, options); //HERE IS PROBLEM - bitmap = null. 
    return bitmap; 
} 

private int getInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    int width = options.outWidth; 
    int height = options.outHeight; 
    int inSampleSize = 1; 

    if(height > reqHeight || width > reqWidth) { 
     int halfHeight = height/2; 
     int halfWidth = width/2; 

     while ((halfHeight/inSampleSize) > reqHeight && 
       (halfWidth/inSampleSize) > reqWidth) { 
      inSampleSize *= 2; 
     } 
    } 

    return inSampleSize; 
} 

I Kommentar hinzufügen wo Problem. Also, ich habe debuggen und zu diesem Zeitpunkt:

Bitmap bitmap = BitmapFactory.decodeStream(inputStream, rect, options); 

Bitmap gleich zu null.

Was ist ein Problem? Was ich falsch mache?

Wie Sie sehen können, sind diese Hilfsmethoden von Android Entwickler Leitfaden.

Ich brauche AKTUALISIERT zweimal zu entschlüsseln, weil ich Möglichkeiten erhalten müssen und dann die Bildgröße erhalten InSampleSize zu berechnen um dieses Bild zip.

Zum zweiten Mal, Optionen nicht gleich null - ich überprüfe es über debug.

Aber nach der zweiten Dekodierung Optionen outWidth und outHeight als -1. Also, es ist standardmäßig eingestellt. Ich weiß nicht, was in diesem Moment passiert.

Antwort

1

Ich denke, Ihr Problem sein kann, weil die Berufung decodeStream zweimal

BitmapFactory.decodeStream(inputStream, rect, options); //HERE 
options.inSampleSize = getInSampleSize(options, 128, 128); 

options.inJustDecodeBounds = false; 
Bitmap bitmap = BitmapFactory.decodeStream(inputStream, rect, options); //HERE AGAIN 
return bitmap; 
+0

Einstellung der Stream-Position zurück zum Anfang kann es beheben. Oder hol dir einen neuen Stream. Als der ursprüngliche wird verbraucht worden sein. – Doomsknight

+0

Ja, ich werde versuchen, Original-Stream zu speichern, und wenn ich es zum zweiten Mal entziffern werde, werde ich diese Kopie des Originals verwenden. Aber ich muss es zweimal für die Einstellung von Optionen verwenden, weil ich auch Bild zuschneiden und es weniger Gewicht bekommen muss (nicht 2 mb, 200 kb, zum Beispiel). – DefaultXYZ

+0

Ja, ich bekomme InputStream zweimal und es hilft mir! Vielen Dank! – DefaultXYZ

0

können Sie versuchen, BitmapFactory.decodeStream(inputStream, null, options);

+0

können Sie bitte weitere Informationen zu Ihrer Antwort hinzufügen - zumindest die Anfangsvariablen für 'inputstream' und' options' und stellen Sie sicher, warum Sie 'null' als Parameter verwenden! Vielen Dank! – cramopy

0

Aus den Dokumenten, die Default-Konstruktor der BitmapFactory.Options können Sie diese werden geben troubl:

BitmapFactory.Options() Create a default Options object, which if left unchanged will give the same result from the decoder as if null were passed.

Und wenn die Optionen Paramter ist null (oder als null verhalten), dann wird das Ergebnis null sein:

The decoded bitmap, or null if the image data could not be decoded, or, if opts is non-null, if opts requested only the size be returned (in opts.outWidth and opts.outHeight)

versuchen, eine bessere Optionen Objekt oder mit der Methode

machen
public static Bitmap decodeStream (InputStream is) 
0

Was Wenn Sie auf diese Weise versuchen:

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK) 
    { 
     Uri imageUri = data.getData(); 
     Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri); 
    } 
} 
+0

Leider hilft es mir nicht, und ich weiß nicht warum :( – DefaultXYZ