how to display images saved in sdcard folder in an

2019-01-06 14:51发布

问题:

As i am working on displaying images saved in sdcard folder, I found the following link.

Displaying images in gridview from SDCard.

I am using the following code to get images from specified folder in sdcard,but here i am getting 0 count.

MyCode.jav

    String[] projection = {MediaStore.Images.Media._ID};

    final String[] columns = { MediaStore.Images.Media.DATA,MediaStore.Images.Media._ID };
    final String orderBy = MediaStore.Images.Media._ID;
    Cursor imagecursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            projection, 
            MediaStore.Images.Media.DATA + " like ? ",
            new String[] {"/my_images"},  
            null);
    int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID);
    this.count = imagecursor.getCount();
    this.thumbnails = new Bitmap[this.count];
    this.arrPath = new String[this.count];
    this.thumbnailsselection = new boolean[this.count];

    for (int i = 0; i < this.count; i++) {
        imagecursor.moveToPosition(i);
        int id = imagecursor.getInt(image_column_index);
        int dataColumnIndex = imagecursor
                .getColumnIndex(MediaStore.Images.Media.DATA);
        thumbnails[i] = MediaStore.Images.Thumbnails.getThumbnail(
                getApplicationContext().getContentResolver(), id,
                MediaStore.Images.Thumbnails.MICRO_KIND, null);
        arrPath[i] = imagecursor.getString(dataColumnIndex);
    }
    imageAdapter = new ImageAdapter();
    secure_gallery_grid.setAdapter(imageAdapter);
    imagecursor.close();

But here as per the following link all the images saved in sd card are displaying. But here i want to display images which are saved in particular folder, as like i created "My_images" folder & saved images in that folder. I want to display images from that folder & need to display in gridview as per link.

回答1:

You can get the path of files from a particualr folder as below

Once you get the path of files you ca display the images in gridview

ArrayList<String> f = new ArrayList<String>();// list of file paths
File[] listFile;

public void getFromSdcard()
{
    File file= new File(android.os.Environment.getExternalStorageDirectory(),"TMyFolder");

        if (file.isDirectory())
        {
            listFile = file.listFiles();


            for (int i = 0; i < listFile.length; i++)
            {

                f.add(listFile[i].getAbsolutePath());

            }
        }
}

Remember to add permissionin manifest file

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

By having write permission will have read permission by default.

Example

main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">

<GridView
    android:id="@+id/PhoneImageGrid"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:columnWidth="90dp"
    android:gravity="center"
    android:horizontalSpacing="10dp"
    android:numColumns="auto_fit"
    android:stretchMode="columnWidth"
    android:verticalSpacing="10dp" />

   </RelativeLayout>

gelleryitem.xml

   <?xml version="1.0" encoding="utf-8"?>
   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<ImageView android:id="@+id/thumbImage" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:layout_centerInParent="true" />
<CheckBox android:id="@+id/itemCheckBox" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:layout_alignParentRight="true"
    android:layout_alignParentTop="true" />
    </RelativeLayout>

AndroidCustomGalleryActivity.java

   public class AndroidCustomGalleryActivity extends Activity {
private int count;
private Bitmap[] thumbnails;
private boolean[] thumbnailsselection;
private String[] arrPath;
private ImageAdapter imageAdapter;
ArrayList<String> f = new ArrayList<String>();// list of file paths
File[] listFile;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    getFromSdcard();
    GridView imagegrid = (GridView) findViewById(R.id.PhoneImageGrid);
    imageAdapter = new ImageAdapter();
    imagegrid.setAdapter(imageAdapter);


}
public void getFromSdcard()
{
    File file= new File(android.os.Environment.getExternalStorageDirectory(),"MapleBear");

        if (file.isDirectory())
        {
            listFile = file.listFiles();


            for (int i = 0; i < listFile.length; i++)
            {

                f.add(listFile[i].getAbsolutePath());

            }
        }
}

public class ImageAdapter extends BaseAdapter {
    private LayoutInflater mInflater;

    public ImageAdapter() {
        mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return f.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(
                    R.layout.galleryitem, null);
            holder.imageview = (ImageView) convertView.findViewById(R.id.thumbImage);

            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }


        Bitmap myBitmap = BitmapFactory.decodeFile(f.get(position));
        holder.imageview.setImageBitmap(myBitmap);
        return convertView;
    }
}
class ViewHolder {
    ImageView imageview;


}
    }

Snap shot



回答2:

Use Universal Image Loader

https://github.com/nostra13/Android-Universal-Image-Loader.git

Give Image url as your sd card image path.

/**
     *adapter class for view pager
     *
     */
    private class ImagePagerAdapter extends PagerAdapter {
        LayoutInflater inflater;
        public ImagePagerAdapter() {
            inflater=getActivity().getLayoutInflater();
        }

        @Override
        public int getCount() {
            return viewPagerList.size();
        }
        @Override
        public void finishUpdate(View container) {
        }
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view.equals(object);
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View imageLayout = inflater.inflate(R.layout.item_pager_image, container, false);
            ImageView imageView = (ImageView) imageLayout.findViewById(R.id.image);
            final ProgressBar spinner = (ProgressBar) imageLayout.findViewById(R.id.loading);
            String loadURL=null;
            if(connectivityManager.hasDataConnectivity()){
                loadURL=viewPagerList.get(position).getModelImageUrl();
            }
            else {
                String fileName=viewPagerList.get(position).getModelImageUrl();
                fileName = fileName.replace(':', '/');
                fileName = fileName.replace('/', '_');
                loadURL="file://"+Environment.getExternalStorageDirectory()+"/"+folder+"/"+fileName;
            }
            BaseActivity.imageLoader.displayImage(loadURL, imageView, options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingStarted(String imageUri, View view) {
                    spinner.setVisibility(View.VISIBLE);
                }

                @Override
                public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                    String message = null;
                    switch (failReason) {
                    case IO_ERROR:
                        message = "Input/Output error";
                        break;
                    case OUT_OF_MEMORY:
                        message = "Out Of Memory error";
                        break;
                    case NETWORK_DENIED:
                        message = "Downloads are denied";
                        break;
                    case UNSUPPORTED_URI_SCHEME:
                        message = "Unsupported URI scheme";
                        break;
                    case UNKNOWN:
                        message = "Unknown error";
                        break;
                    }
                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();

                    spinner.setVisibility(View.GONE);
                }

                @Override
                public void onLoadingComplete(final String imageUri, View view, final Bitmap loadedImage) {
                    spinner.setVisibility(View.GONE);
                    Logger.show(Log.INFO, "@@@@@@@", imageUri);
                    String uniqueUrlName = imageUri.replace(':', '/');
                    uniqueUrlName = uniqueUrlName.replace('/', '_');

                    File file = new File(Environment.getExternalStorageDirectory()
                            .toString()
                            + "/"
                            + folder
                            + "/"
                            + uniqueUrlName);
                    if(!file.exists()){
                        new Thread(new Runnable() {

                            public void run() {
                                String imageUrlString="file://"+GetModels.getModelURL(imageUri,folder,loadedImage,context);
                                Logger.show(Log.INFO, context.getClass().getName(), "image loaded my folfer"+ imageUrlString);
                            }
                        }).start();
                    }
                    Logger.show(Log.INFO, context.getClass().getName(), "image loaded loader "+ StorageUtils.getCacheDirectory(context));

                }  
            });

            imageView.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {

                    Bundle b=new Bundle();
                    b.putString("ProductName", viewPagerList.get(pos).getModelName());
                    b.putString("ProductPrice", viewPagerList.get(pos).getModelPrice());
                    b.putString("ProductUrl",viewPagerList.get(pos).getModelLink() );
                    String loadURL=null;
                    if(connectivityManager.hasDataConnectivity()){
                        loadURL=viewPagerList.get(pos).getModelImageUrl();
                    }
                    else {
                        String fileName=viewPagerList.get(pos).getModelImageUrl();
                        fileName = fileName.replace(':', '/');
                        fileName = fileName.replace('/', '_');
                        loadURL="file://"+Environment.getExternalStorageDirectory()+"/"
                                +folder+"/"+fileName;
                    }
                    b.putString("ProductImage", loadURL);
                    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                    FragmentTransaction fragmentTransaction = fragmentManager
                            .beginTransaction();
                    fragmentTransaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left,R.anim.slide_in_left, R.anim.slide_out_right);
                    ProductOverview commentFragment = new ProductOverview();
                    commentFragment.setArguments(b);
                    fragmentTransaction.replace(R.id.product_container, commentFragment);
                    fragmentTransaction.addToBackStack(null);
                    fragmentTransaction.commit();

                }
            });
            ((ViewPager) container).addView(imageLayout, 0);
            return imageLayout;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            ((ViewPager) container).removeView((View) object);
        }
        @Override
        public void restoreState(Parcelable state, ClassLoader loader) {
        }

        @Override
        public Parcelable saveState() {
            return null;
        }

        @Override
        public void startUpdate(View container) {
        }
    }


回答3:

it is not possible to display particular folder images using the mediastore method. because every images stored in the mediastore has different unique id to identify it.

but you can do by create your own method to identify what are the images in the particular folder and then get the create thumbnail images.



回答4:

Here I am posting code to retrieve file names from "particular directory". You need to do some other task your self.

File imgDir = new File(Environment.getExternalStorageDirectory()+ File.separator + "directory");

if (!imgDir.exists())
    imgDir.mkdir();

String files[] = imgDir.list();

Now check whether "files[]" is null or not.

if (files == null)
    // no files
else{
    count = files.length;
    //do something
}

You have list of files with their path, fetch out bitmap from them and display in grid.

NoTe:

To print full path use following code.

imgDir.getAbsolutePath() + File.separator + files[i]);