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