Comment transmettez-vous les images (bitmaps) entre les activités Android à l’aide de bundles?

Supposons que je dispose d’une activité pour sélectionner une image dans la galerie et la récupérer en tant que BitMap, tout comme l’exemple: ici

Maintenant, je veux passer ce BitMap pour être utilisé dans une ImageView pour une autre activité. Je suis conscient que les bundles peuvent être passés entre les activités, mais comment puis-je stocker ce BitMap dans le bundle?

ou y a-t-il une autre approche que je devrais prendre?

Je recommande fortement une approche différente.

C’est possible si vous voulez VRAIMENT le faire, mais cela coûte beaucoup de mémoire et est également lent. Cela pourrait ne pas fonctionner si vous avez un ancien téléphone et un gros bitmap. Vous pourriez simplement le passer en tant que supplément, par exemple intent.putExtra("data", bitmap) . Un Bitmap implémente Parcelable, vous pouvez donc le mettre en plus. De même, un bundle a putParcelable .

Si vous voulez le passer entre les activités, je le stockerais dans un fichier. C’est plus efficace et moins de travail pour vous. Vous pouvez créer des fichiers privés dans votre dossier de données en utilisant MODE_PRIVATE qui ne sont accessibles à aucune autre application.

Si vous le transmettez en tant que Parcelable, vous devez obtenir une erreur JAVA BINDER FAILURE. La solution est donc la suivante: si le bitmap est petit, comme une vignette, transmettez-le en tant que tableau d’octets et créez le bitmap à afficher dans l’activité suivante. Par exemple:

dans votre activité d’appel …

 Intent i = new Intent(this, NextActivity.class); Bitmap b; // your bitmap ByteArrayOutputStream bs = new ByteArrayOutputStream(); b.compress(Bitmap.CompressFormat.PNG, 50, bs); i.putExtra("byteArray", bs.toByteArray()); startActivity(i); 

… et dans votre activité de réception

 if(getIntent().hasExtra("byteArray")) { ImageView previewThumbnail = new ImageView(this); Bitmap b = BitmapFactory.decodeByteArray( getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length); previewThumbnail.setImageBitmap(b); } 

Comme suggéré par @EboMike, j’ai enregistré le bitmap dans un fichier nommé myImage dans le stockage interne de mon application non accessible à mes autres applications. Voici le code de cette partie:

 public Ssortingng createImageFromBitmap(Bitmap bitmap) { Ssortingng 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 bitmap en utilisant le code suivant:

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

Remarque Beaucoup de vérifications pour les bitmap nuls et de mise à l’échelle sont effectuées.

Bitmap est Parcelable , vous pouvez donc append la méthode [putExtra (Ssortingng, Parcelable)] [2], mais vous n’êtes pas sûr que ce soit une bonne pratique. .

[2]: http://soffr.miximages.com/android/Intent, 100, stream); byte[] bytes = stream.toByteArray(); intent.putExtra(“bitmapbytes”,bytes);

Et dans la seconde activité

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

en premier.java

 Intent i = new Intent(this, second.class); i.putExtra("uri",uri); startActivity(i); 

en second.java

 Bundle bd = getIntent().getExtras(); Uri uri = bd.getParcelable("uri"); Log.e("URI", uri.toSsortingng()); try { Bitmap bitmap = Media.getBitmap(this.getContentResolver(), uri); imageView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

J’ai dû redimensionner un peu le bitmap pour ne pas dépasser la limite de 1 Mo du classeur de transaction. Vous pouvez adapter le 400 à votre écran ou le rendre dynamic. Cela fonctionne bien et la qualité est agréable. C’est aussi beaucoup plus rapide que de sauvegarder l’image et de la charger après, mais vous avez la limite de taille.

 public void loadNextActivity(){ Intent confirmBMP = new Intent(this,ConfirmBMPActivity.class); ByteArrayOutputStream stream = new ByteArrayOutputStream(); Bitmap bmp = returnScaledBMP(); bmp.compress(Bitmap.CompressFormat.JPEG, 100, stream); confirmBMP.putExtra("Bitmap",bmp); startActivity(confirmBMP); finish(); } public Bitmap returnScaledBMP(){ Bitmap bmp=null; bmp = tempBitmap; bmp = createScaledBitmapKeepingAspectRatio(bmp,400); return bmp; 

}

Après avoir récupéré le bmp dans votre nextActivity avec le code suivant:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_confirmBMP); Intent intent = getIntent(); Bitmap bitmap = (Bitmap) intent.getParcelableExtra("Bitmap"); } 

J’espère que ma réponse a été utile. Salutations

Écrivez ce code à partir de l’endroit où vous souhaitez participer à l’activité suivante.

  yourimageView.setDrawingCacheEnabled(true); Drawable drawable = ((ImageView)view).getDrawable(); Bitmap bitmap = imageView.getDrawingCache(); Intent intent = new Intent(getBaseContext(), NextActivity.class); intent.putExtra("Image", imageBitmap); 

Fonction onCreate de NextActivity.class

 Bitmap hotel_image; Intent intent = getIntent(); hotel_image= intent.getParcelableExtra("Image"); 

Vous pouvez passer une image en bref sans utiliser de bundle comme ceci. Ceci est le code du fichier .class de l’expéditeur.

 Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher; Intent intent = new Intent(); Intent.setClass(.this,  

et ceci est le code de fichier de classe de récepteur.

 Bitmap bitmap = (Bitmap)this.getIntent().getParcelableExtra("Bitmap"); ImageView viewBitmap = (ImageView)findViewById(R.id.bitmapview); viewBitmap.setImageBitmap(bitmap); 

Pas besoin de compresser. c'est tout