162 votes

Comment puis-je passer un objet Bitmap d'une activité à une autre ?

Dans mon activité, je crée un Bitmap et ensuite je dois lancer un autre Activity , Comment puis-je passer cette Bitmap de la sous-activité (celle qui va être lancée) ?

317voto

Erich Douglass Points 21714

Bitmap met en œuvre Parcelable donc vous pouvez toujours le 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");

94 votes

Si le bitmap existe sous forme de fichier ou de ressource, il est toujours préférable de passer l'attribut URI ou ResourceID du bitmap et non le bitmap lui-même. Transmettre le bitmap entier nécessite beaucoup de mémoire. Transmettre l'URL nécessite très peu de mémoire et permet à chaque activité de charger et de mettre à l'échelle le bitmap selon ses besoins.

4 votes

Ça ne marche pas pour moi, mais celui-là oui : stackoverflow.com/questions/11010386/

1 votes

@slayton comment passer les images comme URI / ResourceIDs ? exemple ? merci !

25voto

Harlo Holmes Points 1763

En fait, le fait de passer un bitmap en tant que Parcelable entraînera une erreur "JAVA BINDER FAILURE". Essayez de passer le bitmap comme un tableau d'octets et de le construire pour l'afficher dans l'activité suivante.

J'ai partagé ma solution ici :
comment faire passer des images (bitmaps) entre des activités Android à l'aide de bundles ?

23voto

Illegal Argument Points 4244

Transférer un bitmap en tant que Parceable dans un paquet entre deux activités n'est pas une bonne idée à cause de la limite de taille de Parceable (1mb). 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 un bitmap dans un fichier monImage 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;
}

Ensuite, dans l'activité suivante, vous pouvez décoder ce fichier myImage en un bitmap en utilisant le code suivant :

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

Note De nombreux contrôles de nullité et de mise à l'échelle des bitmaps sont omis.

2 votes

Ceci ne compilera pas - ne peut pas résoudre la méthode openFileOutput .

0voto

moijdik Points 1

Vous écrivez

public static Bitmap bitmap;

dans les deux classes (class1 et class2, class2 est appelée par class1 grâce à

startActivity(new Intent("path to class2"));)

et vous modifiez juste le bitmap dans la classe 2 et ensuite il est modifié dans la classe 1 ? cela ne fonctionne pas pour moi

-2voto

Robert Hilse Points 171

Dans mon cas, la méthode mentionnée ci-dessus n'a pas fonctionné pour moi. Chaque fois que j'ai placé le bitmap dans l'intention, la deuxième activité n'a pas démarré. La même chose s'est produite lorsque j'ai passé le bitmap comme byte[].

J'ai suivi ce lien et ça a marché comme un charme et très vite :

package your.packagename

import android.graphics.Bitmap;

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

dans ma 1ère activité :

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

et voici le 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));
    }
}

0 votes

J'ai essayé ça, ça n'a pas marché. J'ai suivi le lien, et il semble que vous auriez dû utiliser CommonResources.photoFinishBitmap au lieu de Constants.photoFinishBitmap .

1 votes

Mauvaise pratique. Que se passera-t-il avec le champ statique de la classe Activity pendant la recréation de l'ensemble du processus (par exemple, en raison de la modification des autorisations de l'application au moment de l'exécution) ? La réponse est NPE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X