Отправить Bitmap, используя намерение Android

Я hava переменная Bitmap в имени Activity1 bmp, и я хочу отправить ее в Activity2 с помощью этого кода:

Intent in1 = new Intent(this, Activity2.class);
in1.putExtra("image",bmp);
startActivity(in1);

И в Activity2 я называю это следующим образом:

Bundle ex = getIntent().getExtras();
Bitmap bmp2 = ex.getParceable("image");
ImageView result = (ImageView)findViewById(R.Id.imageView1);
result.setImageBitmap(bmp);

почему, когда я запускаю программу, она просто запускается и не дает никакого результата? кто-нибудь может мне помочь?

Ответ 1

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

//Convert to byte array
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();

Intent in1 = new Intent(this, Activity2.class);
in1.putExtra("image",byteArray);

Затем в действии 2:

byte[] byteArray = getIntent().getByteArrayExtra("image");
Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

изменить

Думаю, что я должен обновить это с помощью лучшей практики:

В вашем первом действии вы должны сохранить битмап на диск, а затем загрузить его в следующем действии. Убедитесь, что вы переработали свой растровый рисунок в первом действии, чтобы настроить его на сборку мусора:

Действие 1:

try {
    //Write file
    String filename = "bitmap.png";
    FileOutputStream stream = this.openFileOutput(filename, Context.MODE_PRIVATE);
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);

    //Cleanup
    stream.close();
    bmp.recycle();

    //Pop intent
    Intent in1 = new Intent(this, Activity2.class);
    in1.putExtra("image", filename);
    startActivity(in1);
} catch (Exception e) {
    e.printStackTrace();
}

В действии 2 загрузите растровое изображение:

Bitmap bmp = null;
String filename = getIntent().getStringExtra("image");
try {
    FileInputStream is = this.openFileInput(filename);
    bmp = BitmapFactory.decodeStream(is);
    is.close();
} catch (Exception e) {
    e.printStackTrace();
}

Ура!

Ответ 2

Иногда битмап может быть слишком большим для кодирования и декодирования или передачи в виде байтового массива в намерении. Это может вызвать либо OOM, либо плохой интерфейс пользователя.

Я предлагаю рассмотреть возможность поместить растровое изображение в статическую переменную нового действия (тот, который его использует), который будет иметь нулевое значение, когда оно вам больше не понадобится (что означает onDestroy, но только если "isChangingConfigurations" возвращает false).

Ответ 3

Мы также можем решить это, не передавая данные через намерение. Просто сохраните изображение в памяти, а в следующем Управлении просто загрузите изображение из этого места, что также может избежать сбоя приложения при передаче больших растровых данных. Примечание. Вам не нужно даже передавать путь местоположения к намерению, запомнить путь и использовать его.

Ответ 4

Я также хотел бы опубликовать ответ на лучший способ для тех, кто хочет это сделать (но может задавать неправильный вопрос).

Вместо того, чтобы передавать растровое изображение (которое, как я полагаю, вы загрузили из сети, в противном случае у вас уже будет ссылка на файл), я рекомендую использовать загрузчик изображений, например Универсальный загрузчик изображений, чтобы загрузить изображение в ImageView. Вы можете настроить его для кэширования изображения на диск:

 DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .considerExifParams(true)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .build();
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
                .defaultDisplayImageOptions(defaultOptions)
                .build();

        ImageLoader.getInstance().init(config);

Теперь просто передайте URL-адрес изображения в своем намерении и используйте UIL для загрузки изображения. Например, в вашей вновь созданной активности изображение будет загружаться мгновенно, потому что оно загружается из кеша - даже если ваш URL-адрес изображения истек с момента загрузки.

Ответ 5

Просто мы можем передать только Uri растрового изображения вместо передачи объекта Bitmap. Если объект Bitmap большой, это вызовет проблему с памятью.

FirstActivity.

intent.putExtra("uri", Uri);

Из SecondActivity мы возвращаем растровое изображение.

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),Uri.parse(uri));

Ответ 6

Bundle b = new Bundle();
b.putSerializable("Image", Bitmap);
mIntent.putExtras(b);
startActivity(mIntent);