user8042571
user8042571

Reputation:

Pass gallery image from MainActivity to another Activity

My Main2Activity class

public class Main2Activity extends AppCompatActivity {

    private static int PICK_IMAGE_REQUEST = 1;
    ImageView imgView;
    static final String TAG = "Main2Activity";

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

    public void loadImagefromGallery(View view) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        try {

            if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && null != data) {

                final Uri uri = data.getData();

                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                int nh = (int) (bitmap.getHeight() * (1024.0 / bitmap.getWidth()));
                Bitmap scaled = Bitmap.createScaledBitmap(bitmap, 1024, nh, true);
                imgView = (ImageView) findViewById(imageView);
                imgView.setImageBitmap(scaled);

                Button button3 = (Button) findViewById(bt_tab3);
                button3.setOnClickListener
                        (new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(getApplicationContext(), Main3Activity.class);
                        intent.setData(uri).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        startActivity(intent);
                    }
                });
            } else {
                Toast.makeText(this, "No.", Toast.LENGTH_LONG).show();
            }

        } catch (Exception e) {
            Toast.makeText(this, "Oops! Sorry", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }
}

And the Main3Activity

public class Main3Activity extends AppCompatActivity {
    ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        imageView = (ImageView) findViewById(R.id.imageView2);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Uri imageUri = getIntent().getData();
        imageView.setImageURI(imageUri);
    }
}

How can I show same gallery image in MainActivity and another Activity?

Upvotes: 1

Views: 2663

Answers (3)

Ferdous Ahamed
Ferdous Ahamed

Reputation: 21736

Move your Button related codes into onCreate() and send Uri as String using intent extras.

Update Main2Activity as below:

public class Main2Activity extends AppCompatActivity {

    static final String TAG = "Main2Activity";

    private static int PICK_IMAGE_REQUEST = 1;

    ImageView imgView;
    Button button3;

    Uri imageUri;

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

        imgView = (ImageView) findViewById(R.id.imageView);
        button3 = (Button) findViewById(R.id.bt_tab3);

        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), Main3Activity.class); 
                intent.putExtra("imageUri", imageUri.toString());
                startActivity(intent);
            }
        });
    }

    public void loadImagefromGallery(View view) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        try {

            if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && null != data) {
                // Get uri
                imageUri = data.getData();

                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
                int nh = (int) (bitmap.getHeight() * (1024.0 / bitmap.getWidth()));
                Bitmap scaled = Bitmap.createScaledBitmap(bitmap, 1024, nh, true);
                // Set image
                imgView.setImageBitmap(scaled);

            } else {
                Toast.makeText(this, "No.", Toast.LENGTH_LONG).show();
            }

        } catch (Exception e) {
            Toast.makeText(this, "Oops! Sorry", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }
}

Get Uri as string from intent and construct Uri from string using Uri.parse() method.

Update Main3Activity as below:

public class Main3Activity extends AppCompatActivity {
    ImageView imageView;

    Uri imageUri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        imageView = (ImageView) findViewById(R.id.imageView2);

        if (getIntent().getExtras() != null) {
            imageUri = Uri.parse(getIntent().getStringExtra("imageUri"));
            imageView.setImageURI(imageUri);
        }
    }
}

Upvotes: 1

Pouya Danesh
Pouya Danesh

Reputation: 1627

based on you not accepting previous answers here is a different approach :

first convert your image to byte array like :

Bitmap bm = BitmapFactory.decodeFile("/path/to/image.jpg");
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is bitmap object   
byte[] b = baos.toByteArray(); 

then convert that into string like :

String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);

then from your first activity make an intent and put that string as an extra like:

Intent imageIntent = new Intent(context,Main3Activity.class);
imageIntent.putExtra("image",encodedImage);
startActivity(imageIntent);

and after that it is so easy to get this string in the next activity using getIntent and then getExtra

hope this helps.

Upvotes: 0

Reaz Murshed
Reaz Murshed

Reputation: 24211

Pass the file path from the uri as String like this to Main3Activity.

button3.setOnClickListener
        (new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(getApplicationContext(), Main3Activity.class);
        intent.putExtra("filePath", uri.getPath());
        startActivity(intent);
    }
});

And in Main3Activity get the data passed from the calling Activity like this.

public class Main3Activity extends AppCompatActivity {
    ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        imageView = (ImageView) findViewById(R.id.imageView2);

        File file = new File(getIntent().getStringExtra("filePath"));
        setImageFromFileIntoImageView(file);
    }

    private void setImageFromFileIntoImageView (File imgFile)
        if(imgFile.exists()){
            Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
            imageView.setImageBitmap(myBitmap);
        }
    }
}

You need to add the following permission in your AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Upvotes: 0

Related Questions