首页 文章

如何将Bitmap对象从一个活动传递到另一个活动

提问于
浏览
126

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

8 回答

  • 21

    Bitmap 实现 Parcelable ,因此您始终可以使用intent传递它:

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

    并在另一端检索它:

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

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

    我在这里分享我的解决方案
    how do you pass images (bitmaps) between android activities using bundles?

  • 3

    由于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解码为位图:

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

    Note 省略了许多检查null和缩放位图的问题 .

  • 0

    如果图像太大并且您无法将其保存并加载到存储中,则应考虑使用对位图的全局静态引用(在接收活动内),只有在“isChangingConfigurations”时才会在onDestory上重置为null . 返回true .

  • 269

    因为Intent有大小限制 . 我使用公共静态对象将位图从服务传递到广播....

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

    我的BroadcastReceiver

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

    可能会迟到但可以提供帮助 . 在第一个片段或活动上,请声明一个类......例如

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

    希望能帮助到你 .

  • 4

    您可以创建位图传输 . 试试这个....

    在第一堂课:

    1)创建:

    private static Bitmap bitmap_transfer;
    

    2)创建getter和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()));
    
  • 9

    在我的情况下,上面提到的方式对我没有用 . 每次我将位图放在intent中时,第二个活动都没有启动 . 当我将位图作为byte []传递时,也发生了同样的情况 .

    我跟着这个link它就像一个迷人而且非常快:

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

    在我的第一个活动:

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

相关问题