¿cómo se pasan imágenes (mapas de bits) entre las actividades de Android utilizando paquetes?

Supongamos que tengo una actividad para seleccionar una imagen de la galería y recuperarla como un bitmap, como en el ejemplo: aquí

Ahora, quiero pasar este BitMap para ser utilizado en un ImageView para otra actividad. Soy consciente de que se pueden pasar paquetes entre actividades, pero ¿cómo almacenaría este BitMap en el paquete?

o hay otro enfoque que debería tomar?

Recomiendo mucho un enfoque diferente.

Es posible si REALMENTE desea hacerlo, pero cuesta mucha memoria y también es lento. Puede que no funcione si tienes un teléfono más viejo y un bitmap grande. Podrías pasarlo como un extra, por ejemplo intent.putExtra("data", bitmap) . Un bitmap implementa Parcelable, por lo que puede ponerlo en un extra. Del mismo modo, un paquete tiene putParcelable .

Si desea pasarlo entre actividades, lo almacenaría en un archivo. Eso es más eficiente y menos trabajo para ti. Puede crear archivos privados en su carpeta de datos usando MODE_PRIVATE que no son accesibles para ninguna otra aplicación.

Si lo pasa como Parcelable, obtendrá un error JAVA BINDER FAILURE. Entonces, la solución es esta: si el bitmap es pequeño, como, por ejemplo, una miniatura, páselo como una matriz de bytes y crea el bitmap para mostrar en la siguiente actividad. Por ejemplo:

en tu actividad de llamada …

 Intent i = new Intent(this, NextActivity.class); Bitmap b; // your bitmap ByteArrayOutputStream bs = new ByteArrayOutputStream(); b.compress(Bitmap.CompressFormat.PNG, 50, bs); i.putExtra("byteArray", bs.toByteArray()); startActivity(i); 

… y en tu actividad de recepción

 if(getIntent().hasExtra("byteArray")) { ImageView previewThumbnail = new ImageView(this); Bitmap b = BitmapFactory.decodeByteArray( getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length); previewThumbnail.setImageBitmap(b); } 

Como lo sugirió @EboMike, guardé el bitmap en un archivo llamado myImage en el almacenamiento interno de mi aplicación, no accesible para mis otras aplicaciones. Aquí está el código de esa parte:

 public String createImageFromBitmap(Bitmap bitmap) { String fileName = "myImage";//no .png or .jpg needed try { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes); FileOutputStream fo = openFileOutput(fileName, Context.MODE_PRIVATE); fo.write(bytes.toByteArray()); // remember close file output fo.close(); } catch (Exception e) { e.printStackTrace(); fileName = null; } return fileName; } 

Luego, en la siguiente actividad, puede decodificar este archivo myImage en un bitmap usando el siguiente código:

 Bitmap bitmap = BitmapFactory.decodeStream(context .openFileInput("myImage"));//here context can be anything like getActivity() for fragment, this or MainActivity.this 

Nota Se omite una gran cantidad de comprobación de null y escalar mapas de bits.

Bitmap es Parcelable para que pueda agregar usando el método [putExtra (String, Parcelable)] [2], pero no estoy seguro de que sea una mejor práctica. Si se trata de datos de gran tamaño, es mejor almacenarlos en un solo lugar y utilizarlos en ambas actividades. .

[2]: http://sofes.miximages.com/android/Intent, 100, stream); byte[] bytes = stream.toByteArray(); intent.putExtra(“bitmapbytes”,bytes);

Y en la segunda actividad

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

en first.java

 Intent i = new Intent(this, second.class); i.putExtra("uri",uri); startActivity(i); 

en second.java

 Bundle bd = getIntent().getExtras(); Uri uri = bd.getParcelable("uri"); Log.e("URI", uri.toString()); try { Bitmap bitmap = Media.getBitmap(this.getContentResolver(), uri); imageView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

Tuve que reescalar un poco el bitmap para no exceder el límite de 1 mb de la carpeta de transacciones. Puedes adaptar el 400 a tu pantalla o hacerlo dynamic, solo pretende ser un ejemplo. Funciona bien y la calidad es agradable. También es mucho más rápido que guardar la imagen y cargarla después, pero tienes la limitación de tamaño.

 public void loadNextActivity(){ Intent confirmBMP = new Intent(this,ConfirmBMPActivity.class); ByteArrayOutputStream stream = new ByteArrayOutputStream(); Bitmap bmp = returnScaledBMP(); bmp.compress(Bitmap.CompressFormat.JPEG, 100, stream); confirmBMP.putExtra("Bitmap",bmp); startActivity(confirmBMP); finish(); } public Bitmap returnScaledBMP(){ Bitmap bmp=null; bmp = tempBitmap; bmp = createScaledBitmapKeepingAspectRatio(bmp,400); return bmp; 

}

Después de recuperar el bmp en su nextActivity con el siguiente código:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_confirmBMP); Intent intent = getIntent(); Bitmap bitmap = (Bitmap) intent.getParcelableExtra("Bitmap"); } 

Espero que mi respuesta haya sido útil. Saludos

Escriba este código desde el lugar que desee en la siguiente actividad.

  yourimageView.setDrawingCacheEnabled(true); Drawable drawable = ((ImageView)view).getDrawable(); Bitmap bitmap = imageView.getDrawingCache(); Intent intent = new Intent(getBaseContext(), NextActivity.class); intent.putExtra("Image", imageBitmap); 

En la función onCreate de NextActivity.class

 Bitmap hotel_image; Intent intent = getIntent(); hotel_image= intent.getParcelableExtra("Image"); 

Puede pasar la imagen en breve sin usar un paquete como este. Este es el código del archivo sender .class.

 Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher; Intent intent = new Intent(); Intent.setClass(.this,  

y este es el código de archivo de la clase de receptor.

 Bitmap bitmap = (Bitmap)this.getIntent().getParcelableExtra("Bitmap"); ImageView viewBitmap = (ImageView)findViewById(R.id.bitmapview); viewBitmap.setImageBitmap(bitmap); 

No es necesario comprimir Eso es