Search code examples
androidandroid-animationandroid-gallery

Display pictures from an arraylist<String> (path name of picture)


I need to display the pictures from my phone on the screen . I am currently getting all the paths of the pictures on tyhe phone (see below). Now I need to display them on the screen. Any ideas?

 ArrayList<String> photoPaths = new ArrayList<String>();        
photoPaths = getAllPhotos(Environment.getExternalStorageDirectory(), photoPaths);
    Log.e(ACCESSIBILITY_SERVICE, "photo array!"+photoPaths);
    Log.e(ACCESSIBILITY_SERVICE, "photo path size"+photoPaths.size());

    for(int i=0;i<photoPaths.size();i++)
    {
        File imgFile = new  File(photoPaths.get(i));
        if(imgFile.exists())
        {

  Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());

 ImageView myImage = (ImageView) findViewById(R.id.picimageView);
 myImage.setImageBitmap(myBitmap);//NEED TO DISPLAY ALL PICTURES 

        }

Solution

  • Below you will find a Android example of how to access and display images that are stored on your SD card.

    The main idea is to make use of the MediaStore class, which is a Media provider that contains data for all available media on both internal and external storage devices (such as an SD card). An adapter is used as a bridge between the data and the view.

    package blog.android.sdcard;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.MediaStore;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.BaseAdapter;
    import android.widget.GridView;
    import android.widget.ImageView;
    import android.widget.AdapterView.OnItemClickListener;
    
    /**
     * Displays images from an SD card.
     */
    public class SDCardImagesActivity extends Activity {
    
        /**
         * Cursor used to access the results from querying for images on the SD card.
         */
        private Cursor cursor;
        /*
         * Column index for the Thumbnails Image IDs.
         */
        private int columnIndex;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.sdcard);
    
            // Set up an array of the Thumbnail Image ID column we want
            String[] projection = {MediaStore.Images.Thumbnails._ID};
            // Create the cursor pointing to the SDCard
            cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
                    projection, // Which columns to return
                    null,       // Return all rows
                    null,
                    MediaStore.Images.Thumbnails.IMAGE_ID);
            // Get the column index of the Thumbnails Image ID
            columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);
    
            GridView sdcardImages = (GridView) findViewById(R.id.sdcard);
            sdcardImages.setAdapter(new ImageAdapter(this));
    
            // Set up a click listener
            sdcardImages.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView parent, View v, int position, long id) {
                    // Get the data location of the image
                    String[] projection = {MediaStore.Images.Media.DATA};
                    cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            projection, // Which columns to return
                            null,       // Return all rows
                            null,
                            null);
                    columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                    cursor.moveToPosition(position);
                    // Get image filename
                    String imagePath = cursor.getString(columnIndex);
                    // Use this path to do further processing, i.e. full screen display
                }
            });
        }
    
        /**
         * Adapter for our image files.
         */
        private class ImageAdapter extends BaseAdapter {
    
            private Context context;
    
            public ImageAdapter(Context localContext) {
                context = localContext;
            }
    
            public int getCount() {
                return cursor.getCount();
            }
            public Object getItem(int position) {
                return position;
            }
            public long getItemId(int position) {
                return position;
            }
            public View getView(int position, View convertView, ViewGroup parent) {
                ImageView picturesView;
                if (convertView == null) {
                    picturesView = new ImageView(context);
                    // Move cursor to current position
                    cursor.moveToPosition(position);
                    // Get the current value for the requested column
                    int imageID = cursor.getInt(columnIndex);
                    // Set the content of the image based on the provided URI
                    picturesView.setImageURI(Uri.withAppendedPath(
                            MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID));
                    picturesView.setScaleType(ImageView.ScaleType.FIT_CENTER);
                    picturesView.setPadding(8, 8, 8, 8);
                    picturesView.setLayoutParams(new GridView.LayoutParams(100, 100));
                }
                else {
                    picturesView = (ImageView)convertView;
                }
                return picturesView;
            }
        }
    }
    

    The layout of the main activity is shown below:

    <?xml version="1.0" encoding="utf-8"?>
    <GridView xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/sdcard"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:padding="10dp"
        android:verticalSpacing="10dp"
        android:horizontalSpacing="10dp"
        android:numColumns="auto_fit"
        android:columnWidth="90dp"
        android:stretchMode="columnWidth"
        android:gravity="center"
    />
    

    EDIT: In order to be bale to view thumbnails images from the SD Card, Android needs to create them first, hence you should start the Gallery application that comes preinstalled, and open the sdcard folder which will automatically create thumbnails for the images stored on your sdcard. This is a current shortcoming of the SDK that will be fixed in future releases (http://groups.google.com/group/android-developers/browse_thread/thread/3f01b284e2537312/fa9487d19db4907e).

    For some reason, if you use

    MediaStore.Images.Thumbnails.IMAGE_ID

    like in the previous version of the above code, the images are not always displayed on the screen. Changing to

    MediaStore.Images.Thumbnails._ID

    seems to solve the problem. I will look more into why and get back to you. Furthermore, some images have the wrong path attached to them. I changed the creation of the cursor object from

    cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
    projection, // Which columns to return
    null,       // Return all rows
    null,
    null);
    

    To

    cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
    projection, // Which columns to return
    null,       // Return all rows
    null,
    MediaStore.Images.Thumbnails.IMAGE_ID);
    

    Enjoy..!!!