Передача изображения из одного действия в другое

Есть похожие вопросы по SO, но ни один из них не помог мне.

Я хочу получить изображение, по которому щелкнули мышью, в Activity1 и отобразить его в Activity2.
Я получаю идентификатор изображения, по которому щелкнули изображение, следующим образом:

((ImageView) v).getId()

и передать его через намерение другому действию.

Во втором действии я использую идентификатор изображения следующим образом:

imageView.setImageResource(imgId);

Я зарегистрировал значение идентификатора изображения в обоих действиях, и оно то же самое.

Но я получаю следующее исключение:

android.content.res.Resources$NotFoundException: Resource is not a Drawable 
(color or path): TypedValue{t=0x12/d=0x0 a=2 r=0x7f050000}

Я предполагаю, что проблема здесь в том, что getId() возвращает идентификатор ImageView, а не его исходного изображения.
Все эти изображения присутствуют в drawable.

Любая помощь приветствуется.


person GAMA    schedule 17.07.2012    source источник
comment
Кажется, что проблема в том, что проблема здесь в том, что getId () возвращает идентификатор ImageView, а не его исходное изображение. Как получить это изображение? почему не получается изображение? нет в чертежах? это изображение из Интернета. Если изображение из Интернета, вы можете попытаться кэшировать изображение в памяти или в файле и извлечь его при следующем действии, поместив кешированный   -  person Litus    schedule 17.07.2012
comment
так как мне получить ИДЕНТИФИКАТОР РЕСУРСА ???   -  person GAMA    schedule 17.07.2012
comment
Решения @Andro Selva кажутся хорошими :)   -  person Litus    schedule 17.07.2012
comment
@GAMA Пожалуйста, посмотрите мой ответ, и если у вас возникнут вопросы, сообщите мне.   -  person Dipak Keshariya    schedule 17.07.2012


Ответы (5)


Есть 3 решения для решения этой проблемы.

1) Сначала преобразовать изображение в массив байтов, а затем перейти в намерение, а в следующем действии получить массив байтов из пакета и преобразовать в изображение (растровое изображение) и установить в ImageView.

Преобразование растрового изображения в байтовый массив: -

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();

Передать массив байтов в намерение: -

Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("picture", byteArray);
startActivity(intent);

Получить массив байтов из пакета и преобразовать в растровое изображение: -

Bundle extras = getIntent().getExtras();
byte[] byteArray = extras.getByteArray("picture");

Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
ImageView image = (ImageView) findViewById(R.id.imageView1);

image.setImageBitmap(bmp);

2) Сначала сохраните изображение на SDCard, а в следующем упражнении установите это изображение в ImageView.

3) Передайте растровое изображение в намерение и получите растровое изображение в следующем действии из пакета, но проблема в том, что если размер вашего растрового изображения / изображения велик в это время, изображение не загружается в следующем действии.

person Dipak Keshariya    schedule 17.07.2012
comment
@GAMA, если вы напрямую передаете растровое изображение в намерение, и если изображение в это время большое, растровое изображение не отображается в следующем действии, поэтому передача массива байтов безопасна. - person Dipak Keshariya; 17.07.2012
comment
подождите, эта строка для меня не сработает, так как вы даете жестко запрограммированный идентификатор изображения ... Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); - person GAMA; 17.07.2012
comment
У меня есть несколько изображений в действии 1, я хочу отображать ТОЛЬКО изображение, по которому щелкнули мышью, в действии 2. поэтому я не могу указать жестко запрограммированный идентификатор изображения. - person GAMA; 17.07.2012
comment
Я решил проблему, передав идентификатор ресурса изображения, в любом случае спасибо. - person GAMA; 17.07.2012
comment
@GAMA Если вы можете опубликовать, как вы решили эту проблему, передав идентификатор ресурса изображения, это также будет полезно (если вы его помните) - person Basanth; 17.05.2017

Это не сработает. Вы должны попробовать это так.

Установите для параметра DrawingCache вашего ImageView значение true, а затем сохраните фон как Bitmap и передайте его через putExtra.

image.setDrawingCacheEnabled(true);
Bitmap b=image.getDrawingCache();
Intent i = new Intent(this, nextActivity.class);

i.putExtra("Bitmap", b);
startActivity(i);

И в вашем следующем действии

Bitmap bitmap = (Bitmap) intent.getParcelableExtra("Bitmap");
imageView.setImageBitmap(bitmap);
person Andro Selva    schedule 17.07.2012
comment
Я получаю E/JavaBinder(61): !!! FAILED BINDER TRANSACTION !!! И ANR in com.galley.sample (com.galley.sample/.ViewDetails) ... Reason: keyDispatchingTimedOut - person GAMA; 17.07.2012

Определите статическую переменную Drawable в своем классе Application, а затем установите данные для рисования изображения в первом действии, а затем в следующем действии получите данные из статической переменной, которую вы определили в своем классе Application.

public class G extends Application {
   public static Drawable imageDrawable;

   ...
}

Первое действие:

G.imageDrawable = imageView.getDrawable();

SecondActivity:

imgCamera.setImageDrawable(G.imageDrawable);

и в onDestroy:

@Override
protected void onDestroy() {
    G.imageDrawable = null;
    super.onDestroy();
}

Примечание: вы должны определить свой класс Application в манифесте:

<application
        android:name=".G"
        ...>

</application>
person Homayoon Ahmadi    schedule 11.01.2019

Если вы переходите из класса, такого как класс addapter, используйте этот код.

Bitmap bitImg=listItem.getBitmapImage();
    ByteArrayOutputStream baoS = new ByteArrayOutputStream();
    bitImg.compress(Bitmap.CompressFormat.JPEG, 50, baoS);
    intent.putExtra("bitArray", baoS.toByteArray());
    context.getApplicationContext().startActivity(intent);

а затем перейти к следующему действию

if(getIntent().hasExtra("bitArray")) {                
Bitmap bitM = BitmapFactory.decodeByteArray( getIntent().getByteArrayExtra("bitArray"),0,getIntent().getByteArrayExtra("bitArray").length);       
        imgIT = findViewById(R.id.img_detail);
        imgIT.setImageBitmap(bitM);
    }
person Afzaal Ahmed    schedule 04.01.2020

Короче говоря, лучший способ сделать это. Это код файла .class отправителя

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher;
Intent intent = new Intent();
Intent.setClass(<Sender_Activity>.this, <Receiver_Activity.class);
Intent.putExtra("Bitmap", bitmap);
startActivity(intent);

и это код файла класса приемника.

Bitmap bitmap = (Bitmap)this.getIntent().getParcelableExtra("Bitmap");
ImageView viewBitmap = (ImageView)findViewById(R.id.bitmapview);
viewBitmap.setImageBitmap(bitmap);

Сжимать не нужно. Это оно

person Abdul Qadir    schedule 26.01.2018