Hi all
In this tutorial I will show you how to get an image from your phone gallery and show it in an imageview.Here we use intents to open up the image gallery and get the image URI.

Gallery Select Android

Steps :

  • Set the image type as “image” to get only the images.
  • on onActivityResult if the result is OK, then get the data using getData() function and converting the imageURI to the stringPath.
  • Then show the image in the imageview using setImageURI.

Add Permission

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


Build.gradle

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.android.support:design:23.2.1'
}

MainActivity

package select_image_demo.coderzheaven.com.selectimage;

import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final int SELECT_PICTURE = 100;
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main);
        findViewById(R.id.btnSelectImage).setOnClickListener(this);
    }

    /* Choose an image from Gallery */
    void openImageChooser() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE);
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                // Get the url from data
                Uri selectedImageUri = data.getData();
                if (null != selectedImageUri) {
                    // Get the path from the Uri
                    String path = getPathFromURI(selectedImageUri);
                    Log.i(TAG, "Image Path : " + path);
                    // Set the image in ImageView
                    ((ImageView) findViewById(R.id.imgView)).setImageURI(selectedImageUri);
                }
            }
        }
    }

    /* Get the real path from the URI */
    public String getPathFromURI(Uri contentUri) {
        String res = null;
        String[] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
        if (cursor.moveToFirst()) {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            res = cursor.getString(column_index);
        }
        cursor.close();
        return res;
    }

    @Override
    public void onClick(View v) {
        openImageChooser();
    }

}

Layout

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="select_image_demo.coderzheaven.com.selectimage.MainActivity">

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/btnSelectImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_menu_gallery" />

    <ImageView
        android:id="@+id/imgView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:src="@android:drawable/gallery_thumb" />

</FrameLayout>

Note : if you are getting issues with the path selected from photo or Gallery, you can check this post to fix it.

Source Code

You can download the complete Android Studio Source Code from here.

Please send your comments to coderzheaven@gmail.com.

 

49 Comments

  1. Prashant Wankhede July 19, 2011 at 12:23 pm

    Thank u , it works in my application successfully.

     
  2. Prashant Wankhede July 19, 2011 at 12:24 pm

    thank you, above code works in my application.

     
  3. idoudi August 2, 2011 at 6:17 pm

    thank you very much for this tuto…:)))
    but I have a problem with the size of the imageView. It does not take the space I have reserved in xml file.
    can u help me please…

     
    • James August 2, 2011 at 8:41 pm

      Can’ t really understand the question. I think the problem may be because your image resolution is too small to fit in the provided xml size.

       
      • idoudi August 3, 2011 at 1:26 pm

        Exactly. it is a problem of my image resolution..Thank u James for your help…

         
  4. remy215 November 6, 2011 at 6:20 am

    You’re the man! I’ve spent hours trying to figure out why I could not open file based on value returned by data.getPath(). This is in fact because it is not the real file path and I was missing all of the projection & cursor stuff.
    Thanks a lot.
    Remy

     
  5. Pingback: android: cannot load external pictures [solved] « Willing wheels

  6. dabious November 24, 2011 at 12:39 am

    Code works perfect, however after selecting a photo if i click my add photo button again and select a different photo the app force closes . Any way to make this work?

     
    • James November 24, 2011 at 9:40 pm

      Hey dabious please check the Logcat what is the reason for Force Close.

       
  7. dabious November 24, 2011 at 1:37 pm

    Code works great but I am running into this issue.. external allocation too large for this process. Any tutorials on how to implement a down sampling to the images that works with your code above?

     
  8. vineet January 6, 2012 at 11:41 am

    images store in sd card and open gallary
    if click on picture then give message(unfortunately camera has stopped)

     
  9. vineet January 6, 2012 at 11:49 am

    When your code is run then give same message un fortunately camera has stopped.
    please help me
    Please reply as soon as possible

     
    • James January 6, 2012 at 8:33 pm

      Hey vineet, please check the logcat and paste here the reason for this problem. then only I can help, because this is a perfectly working code.

       
  10. Uğur Yaşar March 11, 2012 at 1:43 am

    Thanks a lot. This example is exactly what am i looking.

     
  11. Christina June 7, 2012 at 3:38 am

    Hi, this works perfectly. But, how if i want to save it into database? can you show me the codes? i’ve spent days on this problems.
    Thanks in advance. Appreciate.

     
    • James June 7, 2012 at 3:11 pm

      Don’t save the image to the database, but save it to the SDCARD or the application sandbox and save the corresponding path in the database.

       
  12. Pitr October 13, 2012 at 11:09 am

    Hey this code is pretty cool
    But the only problem I have is
    “The images I take from camera of my application does not display by this image picker”
    Can you help me here?
    Thanx in advance

     
  13. falah November 8, 2012 at 3:21 pm

    hi.i have got error in this two line
    1.import android.provider.MediaStore;
    2. private static final int SELECT_PICTURE = 1;
    please help me…

     
  14. Meenakshi March 15, 2013 at 2:15 pm

    Hi, this works perfectly, bt i want to show the selected image into the next layout.. plz help me..

     
    • James March 15, 2013 at 3:23 pm

      You will get the path of the image just pass it with putExtra to the next activity and show it in the same way. that’s all.

       
  15. jalil August 28, 2013 at 7:07 am

    Hi,
    From API 11
    the “managedQuery()” method is depricated
    so does any one have any isea as how the same program can be done for API 11 and above

    Eclipse adiced to use CursorLoader
    but i dont know how to use it

     
  16. Aisha September 14, 2013 at 4:57 am

    thanks for nice info. 🙂
    Ngg.. I’m a student and start learn android,
    I tried to use this code to take two different picture from gallery and display it into two different imageview.
    But it can’t work. I just success to display first image, but not for the second.
    Do you know why is it?

     
    • James September 14, 2013 at 6:29 am

      Are you setting in the imageview correctly. check once more. it should work with any image.please check your pic request id also.

       
  17. miguel October 4, 2013 at 11:06 pm

    gracias, Saludos from mexico , thanks.

     
  18. smriti December 24, 2013 at 5:20 am

    thanks …………… Works perfect !

     
  19. akhilesh January 18, 2014 at 1:29 pm

    import android.widget.Button;

    showing error

     
  20. sri September 15, 2014 at 11:21 pm

    Hi, I have used this code to upload a picture in the header of list view in the Side Menu Navigation. It works fine but, when I close the application, the image disappears. Is there any solution for that?

     
    • James October 9, 2014 at 10:42 am

      Hi Sri, Didn’t get u..

       
  21. Ankit October 9, 2014 at 5:31 am

    Image Path value is showing null in it. when you sysout in your program

     
  22. gayathri October 16, 2014 at 9:45 am

    Hey there, i am having the same prob, which say the process has stopped. Cn i check if the ” Cursor cursor = managedQuery(uri, projection, null, null, null);” needs to be deprecated?

     
  23. faffou November 6, 2014 at 9:19 am

    Thank you for this tuto, , it works successfully, but i need the same work for an xml file. I mean i want to open and read an xml file. the problem is that i can’t see my file in the galery. Have you any suggestion ??

     
    • James November 6, 2014 at 11:05 am

      Gallery is for images and videos only, not for other types of files.
      Install a file explorer app like ES file explorer and there going to right path you can see the XML file.

      I think your question is “you want to select an xml file by opening a file explorer” Isn’t it?
      Then you have to make a file browser or Check in Google for Libraries like that.
      I am sure You will find more than one.

      Thanks

       
      • faffou November 6, 2014 at 11:29 am

        The problem is that when i click to the button to browse my phone contents, i can see only: galerie, contacts, photos and the MP3 player, so how can i access to the other folders.
        Thinks

         
        • faffou November 6, 2014 at 12:27 pm

          Thank you James. I installed the explorer, and now i can see all files.

           
  24. Wiga July 6, 2015 at 5:01 pm

    The Application closed when i select a image. Can help me ?

     
    • James July 8, 2015 at 8:50 am

      Please reply with the error you are getting in the logcat.

       
  25. Harin Kaklotar July 28, 2015 at 7:25 am

    wow this code so simple to understand….great work:)

     
  26. Niamh August 5, 2015 at 3:49 pm

    Hi this code works great, so thank you for that! However I want to be able to select two different images and then use these images for other processing methods. I have tried multiple ways to enhance this code to allow me to do this but haven’t been successful so far. Could you give me any advice on this?

     
    • James August 29, 2015 at 4:07 pm

      set mulitselect flag

       
  27. priyance August 13, 2015 at 5:11 pm

    This code is working up to the time the application is entering into gallery but as i select image which is to be displayed in imageview, the application is getting crashed. I dont know where the problem is. this is the logcat that is being generated.

    java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at android.app.ActivityThread.pauseGC(ActivityThread.java:5525)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2324)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
    at android.app.ActivityThread.access$900(ActivityThread.java:175)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:146)
    at android.app.ActivityThread.main(ActivityThread.java:5602)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.UnsatisfiedLinkError: Native method not found: dalvik.system.VMRuntime.pauseGc:(Ljava/lang/String;)I
    at dalvik.system.VMRuntime.pauseGc(Native Method)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:515)
                at android.app.ActivityThread.pauseGC(ActivityThread.java:5525)
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2324)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
                at android.app.ActivityThread.access$900(ActivityThread.java:175)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
                at android.os.Handler.dispatchMessage(Handler.java:102)
                at android.os.Looper.loop(Looper.java:146)
                at android.app.ActivityThread.main(ActivityThread.java:5602)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:515)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
                at dalvik.system.NativeStart.main(Native Method)
    08-13 22:43:10.536 8397-8397/com.collegeproject.prsample D/dalvikvm﹕ GC_FOR_ALLOC freed 80K, 13% free 7696K/8760K, paused 13ms, total 13ms
    08-13 22:43:10.556 8397-8397/com.collegeproject.prsample I/dalvikvm-heap﹕ Grow heap (frag case) to 20.473MB for 12582928-byte allocation
    08-13 22:43:10.566 8397-8406/com.collegeproject.prsample D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 6% free 19983K/21052K, paused 12ms, total 12ms
    08-13 22:43:11.041 8397-8397/com.collegeproject.prsample D/libEGL﹕ loaded /system/lib/egl/libEGL_mali.so
    08-13 22:43:11.046 8397-8397/com.collegeproject.prsample D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_mali.so
    08-13 22:43:11.051 8397-8397/com.collegeproject.prsample D/libEGL﹕ loaded /system/lib/egl/libGLESv2_mali.so
    08-13 22:43:11.056 8397-8397/com.collegeproject.prsample E/﹕ Device driver API match
    Device driver API version: 23
    User space API version: 23
    08-13 22:43:11.056 8397-8397/com.collegeproject.prsample E/﹕ mali: REVISION=Linux-r3p2-01rel3 BUILD_DATE=Fri Mar 21 13:52:50 KST 2014
    08-13 22:43:11.121 8397-8397/com.collegeproject.prsample D/OpenGLRenderer﹕ Enabling debug mode 0
    08-13 22:43:11.126 8397-8397/com.collegeproject.prsample W/ViewRootImpl﹕ Dropping event due to no window focus
    08-13 22:43:11.126 8397-8397/com.collegeproject.prsample W/ViewRootImpl﹕ Dropping event due to no window focus
    08-13 22:43:11.126 8397-8397/com.collegeproject.prsample W/ViewRootImpl﹕ Dropping event due to no window focus
    08-13 22:43:11.126 8397-8397/com.collegeproject.prsample W/ViewRootImpl﹕ Dropping event due to no window focus
    08-13 22:43:11.126 8397-8397/com.collegeproject.prsample W/ViewRootImpl﹕ Dropping event due to no window focus
    08-13 22:43:11.126 8397-8397/com.collegeproject.prsample W/ViewRootImpl﹕ Dropping event due to no window focus
    08-13 22:43:11.126 8397-8397/com.collegeproject.prsample W/ViewRootImpl﹕ Dropping event due to no window focus
    08-13 22:43:39.056 8593-8593/com.collegeproject.prsample I/SELinux﹕ Function: selinux_android_load_priority [0], There is no sepolicy file.
    08-13 22:43:39.081 8593-8593/com.collegeproject.prsample I/SELinux﹕ Function: selinux_android_load_priority , spota verifySig and checkHash pass. priority version is VE=SEPF_GT-N7100_4.4.2_0040
    08-13 22:43:39.081 8593-8593/com.collegeproject.prsample I/SELinux﹕ selinux_android_seapp_context_reload: seapp_contexts file is loaded from /data/security/spota/seapp_contexts
    08-13 22:43:39.081 8593-8593/com.collegeproject.prsample D/dalvikvm﹕ Late-enabling CheckJNI
    08-13 22:43:39.311 8593-8593/com.collegeproject.prsample W/dalvikvm﹕ No implementation found for native Ldalvik/system/VMRuntime;.pauseGc:(Ljava/lang/String;)I
    08-13 22:43:39.316 8593-8593/com.collegeproject.prsample E/ActivityThread﹕ Pause GC
    java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at android.app.ActivityThread.pauseGC(ActivityThread.java:5525)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2324)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
    at android.app.ActivityThread.access$900(ActivityThread.java:175)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:146)
    at android.app.ActivityThread.main(ActivityThread.java:5602)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.UnsatisfiedLinkError: Native method not found: dalvik.system.VMRuntime.pauseGc:(Ljava/lang/String;)I
    at dalvik.system.VMRuntime.pauseGc(Native Method)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:515)
                at android.app.ActivityThread.pauseGC(ActivityThread.java:5525)
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2324)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
                at android.app.ActivityThread.access$900(ActivityThread.java:175)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
                at android.os.Handler.dispatchMessage(Handler.java:102)
                at android.os.Looper.loop(Looper.java:146)
                at android.app.ActivityThread.main(ActivityThread.java:5602)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:515)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
                at dalvik.system.NativeStart.main(Native Method)
    08-13 22:43:39.381 8593-8593/com.collegeproject.prsample D/dalvikvm﹕ GC_FOR_ALLOC freed 103K, 13% free 7722K/8808K, paused 16ms, total 16ms
    08-13 22:43:39.381 8593-8593/com.collegeproject.prsample I/dalvikvm-heap﹕ Grow heap (frag case) to 9.567MB for 1120016-byte allocation
    08-13 22:43:39.406 8593-8602/com.collegeproject.prsample D/dalvikvm﹕ GC_FOR_ALLOC freed 1K, 11% free 8815K/9904K, paused 25ms, total 25ms
    08-13 22:43:39.526 8593-8593/com.collegeproject.prsample D/libEGL﹕ loaded /system/lib/egl/libEGL_mali.so
    08-13 22:43:39.531 8593-8593/com.collegeproject.prsample D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_mali.so
    08-13 22:43:39.536 8593-8593/com.collegeproject.prsample D/libEGL﹕ loaded /system/lib/egl/libGLESv2_mali.so
    08-13 22:43:39.546 8593-8593/com.collegeproject.prsample E/﹕ Device driver API match
    Device driver API version: 23
    User space API version: 23
    08-13 22:43:39.546 8593-8593/com.collegeproject.prsample E/﹕ mali: REVISION=Linux-r3p2-01rel3 BUILD_DATE=Fri Mar 21 13:52:50 KST 2014
    08-13 22:43:39.641 8593-8593/com.collegeproject.prsample D/OpenGLRenderer﹕ Enabling debug mode 0

     
  28. mallz August 21, 2017 at 10:19 am

    I am getting the below error only in MI mobile

    UncaughtException: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=file:///storage/emulated/0/DCIM/Camera/IMG_20170820_161028.jpg typ=image/jpeg flg=0x1 }} to activity {com.henotetech.mallzapp/com.henotetech.mallzapp.userprofile.UserProfileeditActivity}: java.lang.NullPointerException: Attempt to invoke interface method ‘boolean android.database.Cursor.moveToFirst()’ on a null object reference
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3744)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3787)
    at android.app.ActivityThread.access$1500(ActivityThread.java:153)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1424)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:5529)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
    Caused by: java.lang.NullPointerException: Attempt to invoke interface method ‘boolean android.database.Cursor.moveToFirst()’ on a null object reference
    at com.henotetech.mallzapp.userprofile.UserProfileeditActivity.getPathFromURI(UserProfileeditActivity.java:559)
    at com.henotetech.mallzapp.userprofile.UserProfileeditActivity.onSelectFromGalleryResult(UserProfileeditActivity.java:521)
    at com.henotetech.mallzapp.userprofile.UserProfileeditActivity.onActivityResult(UserProfileeditActivity.java:740)
    at android.app.Activity.dispatchActivityResult(Activity.java:6508)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3740)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3787) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:153) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1424) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:5529) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) 

     
    • James August 23, 2017 at 5:32 pm

      It appears that something is wrong with the internal library.

       
  29. krishna September 15, 2017 at 6:17 am

    Nice and simple..example..

     
  30. Lav December 3, 2017 at 9:15 am

    Perfect! Thanku:)

     
  31. Anurag December 23, 2017 at 3:16 pm

    Hi, can you provide me the code to upload multiple images using flags.
    I tried using many variations but it kept crashing.

     
  32. Mazhar December 26, 2017 at 7:01 pm

    Thanks, but how can i select a particular type of image like only jpg or only png ?

     
    • James December 27, 2017 at 5:38 pm

      use can intent.setType(“image/png”);

       
      • Mazhar January 6, 2018 at 6:08 pm

        Thanks James.

         
  33. Pingback: Path from URI returning Null when selecting from Photos or Gallery in Android – Solved – CoderzHeaven

Leave a Reply

Your email address will not be published. Required fields are marked *

 

 

 

Theme by HermesThemes

Copyright © 2018 CoderzHeaven. All Rights Reserved

Please wait...

Subscribe to our newsletter

Want to be notified when our article is published? Enter your email address and name below to be the first to know.