2010-03-17 20 views

Respuesta

253

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"); 
+68

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

+0

no funciona en 2.3 –

+3

No funciona para mí, pero este lo hace: http://stackoverflow.com/questions/11010386/send-bitmap-using-intent-android – Houssem

-2

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)); 
    } 
} 
+0

Intenté esto, no funcionó. Seguí el enlace, y parece que debiste haber usado 'CommonResources.photoFinishBitmap' en lugar de' Constants.photoFinishBitmap'. –

+0

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

7

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.

4

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.

3

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

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.

0

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())); 
Cuestiones relacionadas