Enviar mapa de bits con intención Android

Tengo una variable de mapa de bits en el nombre Activity1 es bmp , y quiero enviarla a Activity2 usando este código:

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

Y en Activity2 lo llamo así:

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

¿Por qué cuando ejecuto el programa que acaba de ejecutar y no dar ningún resultado? ¿¿Alguien puede ayudarme??

Convertirlo en una matriz de bytes antes de agregarlo a la intención, enviarlo y decodificar.

 //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); 

Luego en la Actividad 2:

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

editar

Pensé que debería actualizar esto con la mejor práctica:

En su primera actividad, debe guardar el Bitmap en disco y luego cargarlo en la siguiente actividad. Asegúrese de reciclar su mapa de bits en la primera actividad para prepararlo para la recolección de basura:

Actividad 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(); } 

En la actividad 2, cargue el mapa de bits:

 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(); } 

¡Aclamaciones!

A veces, el mapa de bits puede ser demasiado grande para codificar y decodificar o pasar como una matriz de bytes en la intención. Esto puede causar OOM o una mala experiencia de interfaz de usuario.

Sugiero considerar poner el mapa de bits en una variable estática de la nueva actividad (la que la usa) que será cuidadosamente nula cuando ya no lo necesite (que significa en onDestroy pero sólo si "isChangingConfigurations" devuelve false).

También podemos resolver esto sin pasar los datos a través de la intención. Simplemente guarde la imagen en la memoria y en la siguiente Actividad simplemente cargue la imagen desde esa ubicación, lo que también puede evitar que la aplicación se bloquee al pasar datos de mapa de bits grandes. Nota: Ni siquiera necesita pasar la ruta de ubicación a la intención, recuerde la ruta y úsela.

Me gustaría también publicar una respuesta de mejores prácticas para aquellos que buscan hacer esto (pero puede estar haciendo la pregunta equivocada).

En lugar de pasar un mapa de bits alrededor (que supongo que descargó de la red, de lo contrario, ya tendría una referencia de archivo a ella), recomiendo usar un cargador de imágenes como Universal Image Loader para descargar una imagen en un ImageView. Puede configurarlo para luego almacenar en caché la imagen en el disco:

  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); 

Ahora, simplemente pasa la URL de la imagen en tu intento y usa el UIL para cargar la imagen. En la actividad que acaba de crear, por ejemplo, la imagen se cargará instantáneamente porque se está cargando desde la caché, aunque la URL de la imagen haya caducado desde la descarga.

Simplemente podemos pasar sólo Uri del mapa de bits en lugar de pasar objeto Bitmap. Si el objeto Bitmap es grande, esto causará problemas de memoria.

FirstActivity.

 intent.putExtra("uri", Uri); 

De SecondActivity recuperamos bitmap.

 Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),Uri.parse(uri)); 
 Bundle b = new Bundle(); b.putSerializable("Image", Bitmap); mIntent.putExtras(b); startActivity(mIntent); 
  • ¿Cómo obtener la ubicación actual de este código de mapa? También intento recibir datos del vehículo del servidor cuando estoy abierto el mapa
  • Combo de IdentityHashMap y WeakHashMap
  • Lona: intentando usar un mapa de bits reciclado android.graphics.Bitmap
  • Arcgis: cómo obtener la ubicación del dispositivo
  • Mapbox Android SDK - Marcador arrastrable
  • ¿Cómo puedo ocultar mi clave de API de Google Maps al compartir mi código en github?
  • Conversión de valores de latitud / longitud (DMS + Formato de dirección de compás) a valores de punto decimal correspondientes en Android
  • ¿Cómo puede obtener google map v2 api clave para el trabajo en equipo
  • Obtención de 0.0 para latitud y longitud mientras muestra la ubicación actual en el mapa
  • Causado por: java.lang.OutOfMemoryError: tamaño de mapa de bits supera el presupuesto de VM
  • Android: Google Map no muestra
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.