En mi actividad, creo un objeto Bitmap
y luego tengo que iniciar otro Activity
, ¿Cómo puedo pasar este objeto Bitmap
de la subactividad (el que va a ser lanzado)?¿Cómo puedo pasar un objeto de mapa de bits de una actividad a otra
Respuesta
Bitmap
implementa Parcelable
, por lo que siempre puede pasar con la intención:
Intent intent = new Intent(this, NewActivity.class);
intent.putExtra("BitmapImage", bitmap);
y recuperarlo en el otro extremo:
Intent intent = getIntent();
Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage");
En realidad, pasando un mapa de bits como parcelable resultará en un error "JAVA BINDER FAILURE". Intente pasar el mapa de bits como una matriz de bytes y compilarlo para visualizar en la siguiente actividad.
compartí mi solución aquí:
how do you pass images (bitmaps) between android activities using bundles?
Acabo de aprender esta dura lección. No es intuitivo. – ZaBlanc
En mi caso, la forma mencionada anteriormente no funcionó para mí. Cada vez que puse el mapa de bits en la intención, la 2da actividad no comenzó. Lo mismo sucedió cuando pasé el mapa de bits como byte [].
he seguido este link y funcionó como un encanto y muy rápido:
package your.packagename
import android.graphics.Bitmap;
public class CommonResources {
public static Bitmap photoFinishBitmap = null;
}
en mi primera acitiviy:
Constants.photoFinishBitmap = photoFinishBitmap;
Intent intent = new Intent(mContext, ImageViewerActivity.class);
startActivity(intent);
y aquí está la onCreate() de mi segundo Actividad:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bitmap photo = Constants.photoFinishBitmap;
if (photo != null) {
mViewHolder.imageViewerImage.setImageDrawable(new BitmapDrawable(getResources(), photo));
}
}
Intenté esto, no funcionó. Seguí el enlace, y parece que debiste haber usado 'CommonResources.photoFinishBitmap' en lugar de' Constants.photoFinishBitmap'. –
Mala práctica. ¿Qué sucederá con el campo estático en la clase Activity durante la recreación de todo el proceso (por ejemplo, debido a los permisos cambiantes para la aplicación en tiempo de ejecución)? La respuesta es NPE. – Alexander
Pasar bitmap como parceable en paquete entre actividades no es una buena idea debido a la limitación de tamaño de Parceable (1mb). Puede almacenar el mapa de bits en un archivo en el almacenamiento interno y recuperar el mapa de bits almacenado en varias actividades. Aquí hay un código de muestra.
Para almacenar mapas de bits en un archivo myImage en el almacenamiento interno:
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 se puede descodificar este archivo myImage a un mapa de bits utilizando 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 bitmap nulo y escala.
Si la imagen es demasiado grande y no puede guardar & cárguela en el almacenamiento, debe considerar simplemente usar una referencia estática global al mapa de bits (dentro de la actividad de recepción), que se restablecerá a nulo en onDestory , solo si "isChangingConfigurations" devuelve verdadero.
Porque la intención tiene un límite de tamaño. Uso el objeto público estático para pasar el mapa de bits del servicio a la transmisión ....
public class ImageBox {
public static Queue<Bitmap> mQ = new LinkedBlockingQueue<Bitmap>();
}
pase en mi servicio
private void downloadFile(final String url){
mExecutorService.submit(new Runnable() {
@Override
public void run() {
Bitmap b = BitmapFromURL.getBitmapFromURL(url);
synchronized (this){
TaskCount--;
}
Intent i = new Intent(ACTION_ON_GET_IMAGE);
ImageBox.mQ.offer(b);
sendBroadcast(i);
if(TaskCount<=0)stopSelf();
}
});
}
Mi BroadcastReceiver
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
LOG.d(TAG, "BroadcastReceiver get broadcast");
String action = intent.getAction();
if (DownLoadImageService.ACTION_ON_GET_IMAGE.equals(action)) {
Bitmap b = ImageBox.mQ.poll();
if(b==null)return;
if(mListener!=null)mListener.OnGetImage(b);
}
}
};
Puede ser que sea tarde, pero puede ayudar. En el primer fragmento o actividad declaramos una clase ... por ejemplo
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
description des = new description();
if (requestCode == PICK_IMAGE_REQUEST && data != null && data.getData() != null) {
filePath = data.getData();
try {
bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), filePath);
imageView.setImageBitmap(bitmap);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
constan.photoMap = bitmap;
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static class constan {
public static Bitmap photoMap = null;
public static String namePass = null;
}
Luego, en la segunda clase/fragmento de hacer esto ..
Bitmap bm = postFragment.constan.photoMap;
final String itemName = postFragment.constan.namePass;
espero que ayude.
Puede crear una transferencia de mapa de bits. probar esto ....
En la primera clase:
1) Crear:
private static Bitmap bitmap_transfer;
2) Crear getter y setter
public static Bitmap getBitmap_transfer() {
return bitmap_transfer;
}
public static void setBitmap_transfer(Bitmap bitmap_transfer_param) {
bitmap_transfer = bitmap_transfer_param;
}
3) Establecer la imagen:
ImageView image = (ImageView) view.findViewById(R.id.image);
image.buildDrawingCache();
setBitmap_transfer(image.getDrawingCache());
Luego, en la segunda cla ss:
ImageView image2 = (ImageView) view.findViewById(R.id.img2);
imagem2.setImageDrawable(new BitmapDrawable(getResources(), classe1.getBitmap_transfer()));
- 1. ¿Cómo pasar el contexto de una actividad a otra?
- 2. Uso parcelable para pasar un objeto de una actividad a otra androide
- 3. Cómo redirigir de una actividad a otra actividad
- 4. Cómo pasar un contexto de actividad en una aplicación a un servicio en una otra aplicación
- 5. Cómo finalizar una actividad de otra actividad
- 6. ¿Cómo puedo pasar de una página a otra?
- 7. Por qué es tan engorroso pasar la lista de objetos de una actividad a otra actividad
- 8. pasar una cadena de una actividad a otra actividad en Android
- 9. ¿Cómo pasar la referencia (no serializable) de una actividad a otra?
- 10. ¿Cómo puedo transformar un mapa de bits en un Uri?
- 11. Pasar objeto con NSNotificationCenter a otra vista
- 12. pasando jsonarray de 1 actividad a otra
- 13. Transferir datos de una Actividad a otra Actividad Usar Intentos
- 14. Cómo convertir mapa de bits a imagen
- 15. ¿Cómo paso un objeto de una actividad a otra en Android?
- 16. Cómo pasar un zócalo Bluetooth a otra actividad utilizando la interfaz de la aplicación
- 17. Convirtiendo un mapa de bits a monocromo
- 18. Cómo desenfocar un mapa de bits (Android)?
- 19. Cómo pasar el objeto JSON a la nueva actividad
- 20. Cómo actualizar un TextView de una actividad de otra clase
- 21. Conversión de imágenes desde un documento de Word a un objeto de mapa de bits
- 22. ¿Cómo convertir un mapa de bits a Drawable en android?
- 23. ¿Puedo pasar un tipo de objeto a un método genérico?
- 24. cómo enviar imageview de una actividad a otra
- 25. ¿Cómo limpiar un mapa de bits?
- 26. Diferencia entre un mapa de bits y una imagen de mapa de bits en WPF
- 27. Cómo pasar una matriz de objetos de Dirección a otra Acitvity
- 28. Cómo convertir el mapa de bits a una cadena Base64?
- 29. cómo pasar una variable a otra rosca
- 30. Conversión de mapa de bits: crear un mapa de bits que excluya los lados transparentes del mapa de bits transparente
Si el mapa de bits existe como un archivo o un recurso, su es siempre mejor para pasar el '' URI' o ResourceID' del mapa de bits y no el mapa de bits en sí. Pasar todo el mapa de bits requiere mucha memoria. Pasar la URL requiere muy poca memoria y permite que cada actividad cargue y escale el mapa de bits a medida que lo necesiten. – slayton
no funciona en 2.3 –
No funciona para mí, pero este lo hace: http://stackoverflow.com/questions/11010386/send-bitmap-using-intent-android – Houssem