1

I am trying to select the image from gallery and send it to other activity. It's working fine in Kitkat but not working in android Nougat. I tried normal setImageUri and Picasso also. Still not able to render the image on Imageview. Please see below code.

  1. MainActivity.java - I have one button, on click of button I am calling intent to open gallery.
gallery_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setType("image/");
                    startActivityForResult(intent, SELECT_PHOTO);
                }
     });
public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (resultCode == RESULT_OK) {
                if (requestCode == SELECT_PHOTO) {
                    Uri selectedImageUri = data.getData();
                    Log.d("vishal path", selectedImageUri.toString());
                    selectedImagePath = getPath(selectedImageUri);
                    Intent intent = new Intent(this, ImageActivity.class);
                    intent.putExtra("selectedImg", selectedImagePath);
                    startActivity(intent);
                }
            }
        }



public String getPath(Uri uri) {

        if( uri == null ) {
            return null;
        }

        // this will only work for images selected from gallery
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        if( cursor != null ){
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }

        return uri.getPath();
    }

From above methods, I am able to catch the image path from gallery. I can see on log monitor.

  1. ImageActivity

    public class ImageActivity extends AppCompatActivity {

    ImageView mainImg, brushImg, fontImg;
    String imgPath;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image);
    
        mainImg = (ImageView) findViewById(R.id.imageSetMain);
        brushImg = (ImageView) findViewById(R.id.imageBrush);
        fontImg = (ImageView) findViewById(R.id.imageFont);
    
        mainImg.postInvalidate();;
    
        Bundle extras = getIntent().getExtras();
        imgPath = extras.getString("selectedImg");
        Log.d("vishal received path", imgPath);
        // mainImg.setImageURI(null);
        // mainImg.setImageURI(Uri.parse(extras.getString("selectedImg")));
        Picasso.with(ImageActivity.this).load(new File(imgPath)).into(mainImg);
    
        brushImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ImageActivity.this, DrawActivity.class);
                intent.putExtra("selectedImg", imgPath);
                startActivity(intent);
            }
        });
    
        fontImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
            }
        });
    }
    

    }

  2. activity_image.xml

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.mobilesolution.imgedit.ImageActivity">

    <ImageView
        android:id="@+id/imageSetMain"
        android:layout_width="336dp"
        android:layout_height="478dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="16dp"
        app:layout_constraintHorizontal_bias="0.507"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/imageBrush"
        android:layout_width="67dp"
        android:layout_height="38dp"
        app:srcCompat="@drawable/brush"
        android:layout_marginLeft="62dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginBottom="16dp"
        android:layout_marginStart="62dp"
        app:layout_constraintRight_toLeftOf="@+id/imageFont"
        android:layout_marginRight="8dp"
        app:layout_constraintHorizontal_bias="0.08"
        android:layout_marginTop="8dp"
        app:layout_constraintTop_toBottomOf="@+id/imageSetMain"
        app:layout_constraintVertical_bias="1.0" />

    <ImageView
        android:id="@+id/imageFont"
        android:layout_width="65dp"
        android:layout_height="37dp"
        app:srcCompat="@drawable/font"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="83dp"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginBottom="16dp"
        android:layout_marginRight="75dp"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_marginTop="8dp"
        app:layout_constraintTop_toBottomOf="@+id/imageSetMain"
        app:layout_constraintVertical_bias="1.0" />

</android.support.constraint.ConstraintLayout>

And now the main culprit file is here --

I am selecting image in MainActivity.java, by using intent I am passing the image path to next activity called ImageActivity.java.

In ImageActivity.java, I used imageView.setImageUri(uri), not able to see image on device. Same with the picasso.

I have added below dependency for picasso

compile 'com.squareup.picasso:picasso:2.5.2'

Also I have added below permissions to manifest file

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

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

Any help will be appreciable.

Flutterian
  • 1,761
  • 1
  • 21
  • 47
  • are you having problem with Google Photos app? – Rahul Jul 17 '18 at 09:19
  • @RahulKumar - Yeah... After opening the image gallery I used to select image from Photo app. I can see image path in log monitor. But facing issue with rendering it on imageview – Flutterian Jul 17 '18 at 09:24
  • Bundle extras = getIntent().getExtras(); imgPath = extras.getString("selectedImg"); Log.d("vishal received path", imgPath); these lines work ? I mean is it gives image path or not – Shahzad Afridi Jul 17 '18 at 09:35
  • @Opriday- Yes.. It's giving me the path.. "vishal received path: content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F119/ORIGINAL/NONE/1972447643" – Flutterian Jul 17 '18 at 09:36
  • Google photos does not give file path of the file, so it has to be done via stream. I have added code when I do the same in `onActivityResult`. You can find the relevance. – Rahul Jul 17 '18 at 09:38
  • @RahulKumar - Thanks for your reply.. Let me try.. will get back once complete.. – Flutterian Jul 17 '18 at 09:40

3 Answers3

1

i think you should check this answer below:

ACTION_PICK image picker returns diffrent uri formats

maybe different Android OS Version will return different content uri

timmyB
  • 39
  • 5
  • can you post this log by Nougat and Kitkat Log.d("vishal path", selectedImageUri.toString()); – timmyB Jul 17 '18 at 09:35
  • Kitkat Log:- "vishal received path: content://media/external/images/media/20" Nougat Log -: "vishal received path: content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F119/ORIGINAL/NONE/1972447643" – Flutterian Jul 17 '18 at 09:39
  • try this https://stackoverflow.com/questions/30527045/choosing-photo-using-new-google-photos-app-is-broken – timmyB Jul 17 '18 at 09:52
1
        Intent data = getIntent();
        Uri selectedImage = data.getData();

        Bitmap imageBitmap = null;

        if(selectedImage != null && selectedImage.getAuthority() != null) {
            //https://stackoverflow.com/a/30567302/1042124
            InputStream is = null;
            try {
                is = getContentResolver().openInputStream(selectedImage);
                imageBitmap = BitmapFactory.decodeStream(is);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (is != null) {
                        is.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        else {
            String[] filePathColumn = {MediaStore.Images.Media.DATA};

            Cursor cursor = getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();
            imageBitmap = BitmapFactory.decodeFile(picturePath);
        }

At the end, if imageBitmap is not null, load with bitmap into ImageView with Picasso or load it directly.

Rahul
  • 4,699
  • 5
  • 26
  • 38
0

Try to make bitmap from the file path. then set bitmap to your ImageView.

            String ImagePath = getIntent().getStringExtra("selectedImg");
            Bitmap map = BitmapFactory.decodeFile(ImagePath );
            mainImg.setImageBitmap(map);
Shahzad Afridi
  • 2,058
  • 26
  • 24