我怎样才能从一个活动传递一个位图对象到另一个
在我的活动中,我创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)); } }