как передать растровое изображение из одного действия в другое?

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

код камеры

public class camera extends Activity {
static final int REQUEST_IMAGE_CAPTURE = 1;
private static final int CAMERA_REQUEST = 1888;
ImageView imageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera);


    //register
   Button camera = (Button)findViewById(R.id.s_camera);
    camera.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            open();
        }
    });

    Button call = (Button)findViewById(R.id.s_call);
    call.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Uri uri = Uri.parse("tel:0555064740");
            Intent intent = new Intent(Intent.ACTION_VIEW,uri);
            startActivity(intent);
        }
    });



}

public void open(){


   Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent,0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==CAMERA_REQUEST&&resultCode==RESULT_OK) {
        Bitmap bp = (Bitmap) data.getExtras().get("data");
        Intent intent = new Intent(getApplicationContext(), formActivity.class);
        intent.putExtra("BitmapImage", bp);

    }


    }

формаАктивность

public class formActivity  extends Activity {
private static final int CAMERA_REQUEST = 1888;
private ImageView imageView;
Bitmap photo;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_form);
    getData();



}
private void getData(){

    Bitmap bitImage=getIntent().getParcelableExtra("BitmapImage");
    imageView.setImageBitmap(bitImage);

}

кто-нибудь может мне помочь???


person Doha salem    schedule 14.05.2014    source источник
comment
Передайте URI вместо Bitmap   -  person M D    schedule 14.05.2014
comment
Не передавайте растровое изображение из одного действия в другое. Вместо этого сохраните изображение в файле и отправьте путь к файлу следующему действию.   -  person Rethinavel    schedule 14.05.2014
comment
Ответ Spring Breaker хорош, вы также можете использовать onActivityResult(), чтобы получить растровое изображение в первом действии, скажите мне, если вам нужно больше объяснений.   -  person Angudroid    schedule 14.05.2014
comment
вы пропустите startActivity (намерение) в первом действии   -  person Blackbelt    schedule 14.05.2014
comment
Посмотрите мои ответы здесь stackoverflow.com/questions/23606330/   -  person Haresh Chhelana    schedule 14.05.2014


Ответы (3)


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==CAMERA_REQUEST&&resultCode==RESULT_OK) {
        Bitmap bp = (Bitmap) data.getExtras().get("data");
        Intent intent = new Intent(getApplicationContext(), formActivity.class);
        intent.putExtra("BitmapImage", bp);

    }
 }

во фрагменте вы пропустили startActivity(intent). С другой стороны, в formActivity.class перед imageView.setImageBitmap(bitImage); вы должны инициализировать imageView, иначе ваше приложение выйдет из строя. Как упоминалось в поле для комментариев, было бы лучше предоставить URI изображения вместо передачи всего растрового изображения в formActivity.

person Blackbelt    schedule 14.05.2014

Bitmap реализует Parcelable, поэтому вы всегда можете передать его в намерении:

Intent intent = new Intent(this, NewActivity.class);
intent.putExtra("BitmapImage", bitmap);

и получить его на другом конце:

Intent intent = getIntent();
Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage");

вы пропустили startActivity(intent) в первом действии, как прокомментировал blackbelt. Обновите его в своем onActivityResult().

ссылка https://stackoverflow.com/a/2459624/1665507

Вы можете найти рабочий пример по ссылке ниже,

http://androidmaterial.blogspot.in/2012/07/how-to-pass-bitmap-between-activities.html

ИЗМЕНИТЬ:

Как отмечают другие, отправлять большие изображения как Parcelable не рекомендуется. Вы также можете использовать метод ниже,

Передайте Bitamp как расширенные данные

    ByteArrayOutputStream bStream = new ByteArrayOutputStream();
 //Compress it before sending it to minimize the size and quality of bitmap.
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, bStream);
        byte[] byteArray = bStream.toByteArray();
    
        Intent anotherIntent = new Intent(this, anotherActivity.class);
        anotherIntent.putExtra("image", byteArray);
        startActivity(anotherIntent);
        finish();

Получить Bitmap в другом действии

 if(getIntent().hasExtra("image")) 
   {
    ImageView previewThumbnail = new ImageView(this);
    Bitmap b = BitmapFactory.decodeByteArray( getIntent().getByteArrayExtra("image"),0,getIntent().getByteArrayExtra("byteArray").length);        
    previewThumbnail.setImageBitmap(b);
    }

ссылка https://stackoverflow.com/a/12908133/1665507

Также есть другой способ. Хотя вы делаете снимок с камеры или из галереи, вы всегда можете получить точный URI путь к изображению и передать этот путь другому действию. Для отправки больших изображений требуется много памяти, поэтому в соответствии с вашими потребностями выберите лучший способ.

person Spring Breaker    schedule 14.05.2014
comment
он на самом деле делает это - person Blackbelt; 14.05.2014
comment
Вы можете передавать только очень маленькие растровые изображения (например, значки) в Intent Parcelable. Для варианта использования камеры лучше передать Uri файла изображения. - person BladeCoder; 14.05.2014

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

  1. Создайте класс BitmapHelper.

    public class BitmapHelper {
    private Bitmap bitmap = null;
    private static final BitmapHelper instance = new BitmapHelper();
    
    public BitmapHelper(){
    
    }
    
    public static BitmapHelper getInstance(){
        return instance;
    }
    
    public Bitmap getBitmap(){
        return bitmap;
    }
    
    public void setBitmap(Bitmap bitmap){
        this.bitmap = bitmap;
    }
    

    }

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

    //to set the bitmap
    BitmapHelper.getInstance().setBitmap(saveBitmap);
    //to get the bitmap
    anyImageView.setImageBitmap(BitmapHelper.getInstance().getBitmap());
    
person Sohel Mahmud    schedule 01.01.2020