在我的活动中,我创建了一个 Bitmap 对象,然后我需要启动另一个 Activity ,如何从子活动(即将要启动的那个)传递这个 Bitmap 对象?
Bitmap
Activity
Bitmap 实现 Parcelable ,因此您始终可以使用intent传递它:
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”错误 . 尝试将位图作为字节数组传递并构建它以便在下一个活动中显示 .
我在这里分享我的解决方案how do you pass images (bitmaps) between android activities using bundles?
由于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和缩放位图的问题 .
如果图像太大并且您无法将其保存并加载到存储中,则应考虑使用对位图的全局静态引用(在接收活动内),只有在“isChangingConfigurations”时才会在onDestory上重置为null . 返回true .
因为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); } } };
可能会迟到但可以提供帮助 . 在第一个片段或活动上,请声明一个类......例如
@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;
希望能帮助到你 .
您可以创建位图传输 . 试试这个....
在第一堂课:
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()));
在我的情况下,上面提到的方式对我没有用 . 每次我将位图放在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)); } }
8 回答
Bitmap
实现Parcelable
,因此您始终可以使用intent传递它:并在另一端检索它:
实际上,将位图作为Parcelable传递将导致“JAVA BINDER FAILURE”错误 . 尝试将位图作为字节数组传递并构建它以便在下一个活动中显示 .
我在这里分享我的解决方案
how do you pass images (bitmaps) between android activities using bundles?
由于Parceable(1mb)的大小限制,将位图在活动之间的包中传递为parceable并不是一个好主意 . 您可以将位图存储在内部存储器中的文件中,并在多个活动中检索存储的位图 . 这是一些示例代码 .
要将位图存储在内部存储中的文件 myImage 中:
然后在下一个活动中,您可以使用以下代码将此文件myImage解码为位图:
Note 省略了许多检查null和缩放位图的问题 .
如果图像太大并且您无法将其保存并加载到存储中,则应考虑使用对位图的全局静态引用(在接收活动内),只有在“isChangingConfigurations”时才会在onDestory上重置为null . 返回true .
因为Intent有大小限制 . 我使用公共静态对象将位图从服务传递到广播....
通过我的服务
我的BroadcastReceiver
可能会迟到但可以提供帮助 . 在第一个片段或活动上,请声明一个类......例如
然后在第二个类/片段上做这个..
希望能帮助到你 .
您可以创建位图传输 . 试试这个....
在第一堂课:
1)创建:
2)创建getter和setter
3)设置图像:
然后,在第二节课:
在我的情况下,上面提到的方式对我没有用 . 每次我将位图放在intent中时,第二个活动都没有启动 . 当我将位图作为byte []传递时,也发生了同样的情况 .
我跟着这个link它就像一个迷人而且非常快:
在我的第一个活动:
这是我的第二个活动的onCreate():