Как передать объект Bitmap из одного действия в другое

В моей деятельности я создаю объект Bitmap а затем мне нужно запустить другое действие. Как передать этот объект Bitmap из под-активности (тот, который будет запущен)?

Solutions Collecting From Web of "Как передать объект Bitmap из одного действия в другое"

Bitmap реализует 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». Попробуйте передать битмап в виде байтового массива и создать его для отображения в следующем действии.

Я поделился своим решением:
Как вы передаете изображения (растровые изображения) между действиями андроида с помощью пакетов?

Передача битмапа в качестве пассивного в связке между активностью не является хорошей идеей из-за ограничения размера Parceable (1mb). Вы можете сохранить растровое изображение в файле во внутреннем хранилище и получить сохраненное растровое изображение в нескольких действиях. Вот пример кода.

Чтобы сохранить растровое изображение в файле 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 

Примечание. Большая часть проверки для растрового изображения с нулевым и масштабируемым значениями.

Если изображение слишком велико, и вы не можете его сохранить и загрузить в хранилище, вы должны просто использовать глобальную статическую ссылку на растровое изображение (внутри принимающей активности), которое будет сброшено до нуля на onDestory, только если «isChangingConfigurations» Возвращает 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(); } }); } 

Мой радиопередатчик

 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) Создайте геттер и сеттер

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

В моем случае упомянутый выше способ не помог мне. Каждый раз, когда я помещал растровое изображение в намерение, 2-й вид активности не начинался. То же самое произошло, когда я передал битмап в виде байта [].

Я следил за этой ссылкой, и она работала как чары и очень быстро:

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