Отправить 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);