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.
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
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
Ja, ich bekomme InputStream zweimal und es hilft mir! Vielen Dank! – DefaultXYZ