Comment passer un objet Bitmap d'une activité à une autre

dans mon activité, je crée un objet Bitmap et je dois en lancer un autre Activity , Comment passer cet objet Bitmap de la sous-activité (celle qui va être lancée)?

125
demandé sur Vivek Barai 2010-03-17 05:19:34

8 réponses

Bitmap met en œuvre Parcelable , donc vous pouvez toujours passer avec l'intention:

Intent intent = new Intent(this, NewActivity.class);
intent.putExtra("BitmapImage", bitmap);

et le récupérer à l'autre bout:

Intent intent = getIntent(); 
Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage");
268
répondu Erich Douglass 2017-05-01 15:03:11

en fait, passer un bitmap en tant que séparable entraînera une erreur" JAVA BINDER FAILURE". Essayez de passer le bitmap comme un tableau d'octets et de le construire pour l'affichage dans la prochaine activité.

j'ai partagé ma solution ici:

Comment passer des images (bitmaps) entre les activités android en utilisant des paquets?

21
répondu Harlo Holmes 2017-05-23 12:10:41

Disparition bitmap comme parceable dans le faisceau entre l'activité n'est pas une bonne idée en raison de la limitation de taille de Parceable(1 mo). Vous pouvez stocker le bitmap dans un fichier dans le stockage interne et récupérer le bitmap stocké dans plusieurs activités. Voici un exemple de code.

pour stocker bitmap dans un fichier myImage dans le stockage interne:

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

puis dans la prochaine activité vous pouvez décoder ce fichier myImage à un bitmap en utilisant code suivant:

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

Note " 151960920

8
répondu Illegal Argument 2014-07-08 11:50:26

si l'image est trop grande et que vous ne pouvez pas la sauvegarder et la charger sur le stockage, vous devriez envisager d'utiliser simplement une référence statique globale au bitmap (à l'intérieur de l'activité de réception), qui sera réinitialisé à null sur onDestory, seulement si" isChangingConfigurations " retourne true.

4
répondu android developer 2015-05-21 11:04:28

parce que L'intention a une limite de taille . J'utilise l'objet public statique pour faire passer bitmap du service à la diffusion ....

public class ImageBox {
    public static Queue<Bitmap> mQ = new LinkedBlockingQueue<Bitmap>(); 
}

pass dans mon service

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

Mon Émission

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);
            }
        }
    };
3
répondu Deyu瑜 2015-09-24 07:40:22

il est peut-être tard, mais ça peut aider. Sur le premier fragment ou activité, déclarez une classe...par exemple

   @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;
}

ensuite sur la deuxième classe/fragment faire ceci..

Bitmap bm = postFragment.constan.photoMap;
final String itemName = postFragment.constan.namePass;

J'espère que ça aidera.

0
répondu ANTONY MWANGI 2017-04-13 00:36:09

vous pouvez créer un transfert bitmap. essayez ceci....

dans la première classe:

1) Créer:

private static Bitmap bitmap_transfer;

2) Créer getter et setter

public static Bitmap getBitmap_transfer() {
    return bitmap_transfer;
}

public static void setBitmap_transfer(Bitmap bitmap_transfer_param) {
    bitmap_transfer = bitmap_transfer_param;
}

3) Définir l'image:

ImageView image = (ImageView) view.findViewById(R.id.image);
image.buildDrawingCache();
setBitmap_transfer(image.getDrawingCache());

puis, dans la deuxième classe:

ImageView image2 = (ImageView) view.findViewById(R.id.img2);
imagem2.setImageDrawable(new BitmapDrawable(getResources(), classe1.getBitmap_transfer()));
0
répondu Rômulo Z. C. Cunha 2017-07-25 19:08:31

Dans mon cas, la façon mentionnée ci-dessus n'a pas fonctionné pour moi. Chaque fois que j'ai mis l'image dans l'intention, la 2ème activité ne démarre pas. La même chose s'est produite lorsque j'ai passé le bitmap comme byte[].

j'ai suivi ce lien et il a fonctionné comme un charme et très rapide:

package your.packagename

import android.graphics.Bitmap;

public class CommonResources { 
      public static Bitmap photoFinishBitmap = null;
}

dans mon 1er acte:

Constants.photoFinishBitmap = photoFinishBitmap;
Intent intent = new Intent(mContext, ImageViewerActivity.class);
startActivity(intent);

et voici l'onCreate () de ma 2ème activité:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bitmap photo = Constants.photoFinishBitmap;
    if (photo != null) {
        mViewHolder.imageViewerImage.setImageDrawable(new BitmapDrawable(getResources(), photo));
    }
}
-2
répondu rxDroid 2013-07-26 12:19:43