2012-06-13 9 views
46

ich eine Bitmap Variable hava bmp in Activity1 genannt, und ich möchte die Bitmap Activity2Passing android Bitmap-Daten innerhalb Aktivität mit Absicht in Android

Nach senden ist der Code, den ich es passieren, mit der Absicht verwenden.

Intent in1 = new Intent(this, Activity2.class); 
in1.putExtra("image",bmp); 
startActivity(in1); 

Und in Activity2 versuche ich die Bitmap für den Zugriff auf den folgenden Code verwenden läuft

Bundle ex = getIntent().getExtras(); 
Bitmap bmp2 = ex.getParceable("image"); 
ImageView result = (ImageView)findViewById(R.Id.imageView1); 
result.setImageBitmap(bmp); 

Die Anwendung ohne Ausnahme, aber es gibt nicht das erwartete Ergebnis

+2

Dies ist keine Kopie Ihres Codes, wie ich mindestens zwei Tippfehler sehe. – Christine

+0

@Christine: das ist wirklich mein Code hehe ,,, aber ich hatte es aus vielen Tutorial ... XP –

+1

Also, wie Sie ein Bitmap bmp2 erstellen, und Sie setzen es mit setImageBitmap (BMP)? Und sicherlich funktioniert R.Id.imageView1 nicht. Es sollte R.id.imageView1 sein. – Christine

Antwort

137

es zu einem Byte konvertieren Array, bevor Sie es der Absicht hinzufügen, senden und dekodieren.

//Convert to byte array 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
byte[] byteArray = stream.toByteArray(); 

Intent in1 = new Intent(this, Activity2.class); 
in1.putExtra("image",byteArray); 

dann in Aktion 2:

byte[] byteArray = getIntent().getByteArrayExtra("image"); 
Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); 

bearbeiten

dachte ich, das den Regeln der Technik aktualisieren sollte:

In Ihrer ersten Aktivität, sollten Sie sparen Die Bitmap auf Festplatte wird dann in der nächsten Aktivität geladen. Stellen Sie sicher, dass Ihre Bitmap in der ersten Aktivität zu grundieren es für die Garbage Collection recyceln:

Aktivität 1:

try { 
    //Write file 
    String filename = "bitmap.png"; 
    FileOutputStream stream = this.openFileOutput(filename, Context.MODE_PRIVATE); 
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 

    //Cleanup 
    stream.close(); 
    bmp.recycle(); 

    //Pop intent 
    Intent in1 = new Intent(this, Activity2.class); 
    in1.putExtra("image", filename); 
    startActivity(in1); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

In Activity 2, laden die Bitmap:

Bitmap bmp = null; 
String filename = getIntent().getStringExtra("image"); 
try { 
    FileInputStream is = this.openFileInput(filename); 
    bmp = BitmapFactory.decodeStream(is); 
    is.close(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Prost!

+0

yeah ich denke es ist eine gute Idee .. Danke Zed Scio: D –

+1

Dies löste ein Problem, das ich hatte. Eine Ausnahme wurde ausgelöst, weil "transactionTooLargeException". Beim Senden einer zusätzlichen Bitmap. – Reinherd

+0

bessere Lösung ist hier http://stackoverflow.com/questions/2459524/how-can-i-pass-a-bitmap-object-from-one-activity-to-another/2459624#2459624 – Nizzy

-7
Bundle b = new Bundle(); 
b.putSerializable("Image", Bitmap); 
mIntent.putExtras(b); 
startActivity(mIntent); 
+5

Bitmap ist nicht serialisierbar! – Carnal

+0

überprüfen Sie bitte diesen Link: http://Stackoverflow.com/questions/5871482/serializing-and-de-serializing-android-graphics-bitmap-in-java –

4

Manchmal könnte die Bitmap zu groß sein für encode & dekodieren oder passieren als Byte-Array in der Absicht. Dies kann entweder OOM oder eine schlechte Benutzeroberflächenerfahrung verursachen.

Ich schlage vor, das Bitmap in eine statische Variable der neuen Aktivität (die es verwendet) zu setzen, die vorsichtig Null sein wird, wenn Sie sie nicht mehr benötigen (also in onDestroy, aber nur wenn "isChangingConfigurations" false zurückgibt) .

0

Wir können das auch lösen, ohne Daten durch Absicht zu übermitteln. Speichern Sie das Bild einfach im Speicher, und laden Sie das Bild in der nächsten Aktivität einfach von diesem Ort, was auch einen App-Absturz bei der Übertragung großer Bitmap-Daten verhindern kann. Hinweis: Sie müssen den Standortpfad nicht einmal an die Absicht übergeben, den Pfad nicht vergessen und ihn verwenden.

0

Ich möchte auch eine Best Practices-Antwort für diejenigen, die dies tun möchten (aber möglicherweise die falsche Frage stellen).

Anstatt eine Bitmap zu übergeben (die vermutlich aus dem Netzwerk heruntergeladen wurde, ansonsten hätten Sie bereits einen Dateiverweis), empfehle ich, ein Image Loader wie Universal Image Loader zu verwenden, um ein Image in ein ImageView herunterzuladen.Sie können es so konfigurieren, dass dann das Bild auf der Festplatte zwischenspeichern:

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
       .cacheInMemory(true) 
       .cacheOnDisk(true) 
       .considerExifParams(true) 
       .bitmapConfig(Bitmap.Config.RGB_565) 
       .build(); 
     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) 
       .defaultDisplayImageOptions(defaultOptions) 
       .build(); 

     ImageLoader.getInstance().init(config); 

nun nur die Bild-URL in Ihrer Absicht übergeben und verwenden Sie die UIL um das Bild zu laden. In Ihrer neu erstellten Aktivität wird das Bild beispielsweise sofort geladen, da es aus dem Cache geladen wird - auch wenn Ihre Image-URL seit dem Download abgelaufen ist.

0

Einfach können wir nur Uri der Bitmap übergeben, anstatt Bitmap-Objekt zu übergeben. Wenn das Bitmap-Objekt groß ist, führt dies zu einem Speicherproblem.

FirstActivity.

intent.putExtra("uri", Uri); 

Von SecondActivity erhalten wir Bitmap zurück.

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),Uri.parse(uri)); 
+0

IOException, wenn ich Bildpfad in URI übergeben. Was könnte der mögliche Grund sein. –

Verwandte Themen