web-dev-qa-db-fra.com

Passage de données bitmap Android dans l'activité en utilisant Intent dans Android

Je possède une variable bitmap nommée bmp dans Activity1 et je souhaite envoyer le bitmap à Activity2 

Voici le code que j'utilise pour le transmettre avec l'intention.

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

Et dans Activity2, j'essaie d'accéder au bitmap en utilisant le code suivant

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

L'application fonctionne sans exception mais ne donne pas le résultat attendu

57
adi.zean

Convertissez-le en tableau Byte avant de l'ajouter à l'intention, envoyez-le et décodez-le.

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

Puis dans l'activité 2:

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

modifier

J'ai pensé que je devrais mettre à jour ceci avec les meilleures pratiques:

Lors de votre première activité, vous devez enregistrer le bitmap sur le disque, puis le charger dans l'activité suivante. Assurez-vous de recycler votre bitmap dans la première activité pour l'amorcer pour le nettoyage de la mémoire:

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

Au cours de l'activité 2, chargez le bitmap:

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

À votre santé!

168
Zaid Daghestani

Parfois, le bitmap peut être trop volumineux pour encoder et décoder ou passer sous forme de tableau d'octets dans l'intention. Cela peut provoquer soit un MOO, soit une mauvaise expérience d’interface utilisateur.

Je suggère d’envisager de placer le bitmap dans une variable statique de la nouvelle activité (celle qui l’utilise) qui sera soigneusement nulle si vous n’en avez plus besoin (ce qui signifie onDestroy mais uniquement si "isChangingConfigurations" renvoie false).

5

Kotlin Code pour envoyer Bitmap à une autre activité par intention:

1- en première activité:

          val i = Intent(this@Act1, Act2::class.Java)
           var bStream  =  ByteArrayOutputStream()
            bitmap.compress(Bitmap.CompressFormat.PNG, 50, bStream)
            val byteArray = bStream.toByteArray()
            i.putExtra("image", byteArray )
            startActivity(i)

2- Dans l'activité deux (Lire l'image bitmap):

 var bitmap : Bitmap? =null
    if (intent.hasExtra("image")){
      //convert to bitmap          
        val byteArray = intent.getByteArrayExtra("image")
        bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
    }

3- si vous devez le définir comme arrière-plan pour une vue, telle que ConstraintLayout ou ...:

 if (bitmap != null) {
     //Convert bitmap to BitmapDrawable
     var bitmapDrawable = BitmapDrawable( resources , bitmap)
      root_constraintLayout.backgroundDrawable = bitmapDrawable
   }
0
Hamed Jaliliani

Je voudrais également poster une réponse de bonnes pratiques pour ceux qui cherchent à le faire (mais peut-être poser la mauvaise question).

Au lieu de passer un bitmap (que je suppose que vous avez téléchargé du réseau, sinon vous auriez déjà une référence de fichier), je vous recommande d'utiliser un chargeur d'images tel que Universal Image Loader pour télécharger une image dans un ImageView. Vous pouvez le configurer pour mettre ensuite l'image en cache sur le disque:

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

Maintenant, passez simplement l’URL de l’image dans votre intention et utilisez l’UIL pour charger l’image. Par exemple, dans votre activité nouvellement créée, l'image se chargera instantanément car elle se charge depuis le cache, même si l'URL de votre image a expiré depuis le téléchargement.

0
Micro

Nous pouvons également résoudre ce problème sans transmettre de données par intention. Stockez simplement l'image dans la mémoire et, dans la prochaine activité, chargez l'image à partir de cet emplacement, ce qui peut également éviter que l'application bloque l'application en transmettant des données bitmap volumineuses . le chemin et l'utiliser.

0
murali krish

Simplement, nous pouvons uniquement transmettre l’URI du bitmap au lieu de transmettre un objet bitmap. Si l'objet Bitmap est Big, cela provoquera un problème de mémoire.

Première activité.

intent.putExtra("uri", Uri);

De SecondActivity nous récupérons bitmap.

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),Uri.parse(uri));
0
Vignesh Kumar