我怎样才能从一个活动传递一个位图对象到另一个

在我的活动中,我创build了一个Bitmap对象,然后我需要启动另一个Activity ,如何从子活动(即将启动的那个)传递这个Bitmap对象?

Bitmap实现了Parcelable ,所以你可以Parcelable传递它:

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

并在另一端检索它:

 Intent intent = getIntent(); Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage"); 

实际上,传递位图作为Parcelable将导致“JAVA BINDER FAILURE”错误。 尝试将位图作为字节数组传递并构build,以便在下一个活动中显示。

我在此分享我的解决scheme:
你如何通过使用捆绑的android活动之间传递图像(位图)?

由于Parceable(1mb)的大小限制,在活动之间传递位图作为parceable并不是一个好主意。 您可以将位图存储在内部存储的文件中,并通过多个活动检索存储的位图。 这是一些示例代码。

要将位图存储在文件myImage的内部存储中:

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

然后在下一个活动中,您可以使用以下代码将此文件myImage解码为位图:

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

注意很多检查null和缩放位图的操作都被忽略。

如果图片太大,无法将其保存并加载到存储器,则应考虑仅对位图(在接收活动内部)使用全局静态引用,该位置将在onDestory上重置为null,仅当“isChangingConfigurations”返回true。

因为意图有大小限制。 我使用公共静态对象做传递位图从服务广播….

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

通过我的服务

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

我的广播接收器

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

它可能会迟到,但可以帮助。 例如,在第一个片断或活动中,声明一个类…

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

然后在第二课/片段做这个..

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

希望它有帮助。

您可以创build一个位图传输。 尝试这个….

在第一堂课:

1)创build:

 private static Bitmap bitmap_transfer; 

2)创buildgetter和setter

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

3)设置图像:

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

那么,在第二堂课:

 ImageView image2 = (ImageView) view.findViewById(R.id.img2); imagem2.setImageDrawable(new BitmapDrawable(getResources(), classe1.getBitmap_transfer())); 

就我而言,上面提到的方式并不适合我。 每当我把位图的意图,第二个活动没有启动。 当我通过位图byte []时,也发生了同样的情况。

我跟着这个链接 ,它像一个迷人的,非常快的工作:

 package your.packagename import android.graphics.Bitmap; public class CommonResources { public static Bitmap photoFinishBitmap = null; } 

在我的第一个acitiviy:

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

这里是我的第二个活动的onCreate():

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bitmap photo = Constants.photoFinishBitmap; if (photo != null) { mViewHolder.imageViewerImage.setImageDrawable(new BitmapDrawable(getResources(), photo)); } }