Retrieve all images directories in android

115 Views Asked by At

I have tried this to get directories and load images from them but it is very slow to load images and when camera is selected it crashed after some time...

< -------- Code to get directories and images from them ------- >

public static ArrayList<String> getImageBuckets(Context mContext){
    ArrayList<String> buckets = new ArrayList<>();
    Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    String [] projection = {MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.DATA};

    Cursor cursor = mContext.getContentResolver().query(uri, projection, null, null, null);
    if(cursor != null){
        File file;
        while (cursor.moveToNext()){
            String bucketPath = cursor.getString(cursor.getColumnIndex(projection[0]));
            String fisrtImage = cursor.getString(cursor.getColumnIndex(projection[1]));
            file = new File(fisrtImage);
            if (file.exists() && !buckets.contains(bucketPath)) {
                buckets.add(bucketPath);
            }
        }
        cursor.close();
    }
    return buckets;
}


public static ArrayList<String> getImagesByBucket(Context mContext , @NonNull String bucketPath){

    Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    String [] projection = {MediaStore.Images.Media.DATA};
    String selection = MediaStore.Images.Media.BUCKET_DISPLAY_NAME+" =?";
    String orderBy = MediaStore.Images.Media.DATE_ADDED+" DESC";

    ArrayList<String> images = new ArrayList<>();

    Cursor cursor = mContext.getContentResolver().query(uri, projection, selection,new String[]{bucketPath}, orderBy);

    if(cursor != null){
        File file;
        while (cursor.moveToNext()){
            String path = cursor.getString(cursor.getColumnIndex(projection[0]));
            file = new File(path);
            if (file.exists() && !images.contains(path)) {
                images.add(path);
            }
        }
        cursor.close();
    }
    return images;
}

< ---------- Here is adapter and method to select directory --------->

        <--------------------Adapter------------------>


public class GridImageAdapter extends ArrayAdapter<String> {
    private Context mContext;
    private LayoutInflater mInflater;
    private int layoutResource;
    private String mAppend;
    private ArrayList<String> imgURLs;

    public GridImageAdapter(Context context, int layoutResource, String append, ArrayList<String> imgURLs) {
        super(context, layoutResource, imgURLs);
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mContext = context;
        this.layoutResource = layoutResource;
        mAppend = append;
        this.imgURLs = imgURLs;
    }

    @Override
    public int getCount() {
        return imgURLs.size();
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        final ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(layoutResource, parent, false);
            holder = new ViewHolder();
            holder.mProgressBar = (ProgressBar) convertView.findViewById(R.id.gridImageProgressbar);
            holder.image = (SquareImageView) convertView.findViewById(R.id.gridImageView);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        final String imgURL = getItem(position);

        Picasso.with(mContext).load(mAppend + imgURL).error(R.drawable.ic_person).into(holder.image, new com.squareup.picasso.Callback() {
            @Override
            public void onSuccess() {
                if (holder.mProgressBar != null) {
                    Picasso.with(mContext).load(mAppend + imgURL).into(holder.image);
                    holder.mProgressBar.setVisibility(View.GONE);
                }
            }

            @Override
            public void onError() {
                if (holder.mProgressBar != null) {
                    Picasso.with(mContext).load(mAppend + imgURL).into(holder.image);
                    holder.mProgressBar.setVisibility(View.GONE);
                }

            }
        });

        return convertView;
    }

    private static class ViewHolder {
        SquareImageView image;
        ProgressBar mProgressBar;
    }
}

< -------------- Method to set grid view ----------->

private void Directory() {

    directories = FileSearch.getImageBuckets(getActivity());

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity()
            ,android.R.layout.simple_spinner_item ,directories);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    directorySpinner.setAdapter(adapter);

    directorySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
            Log.d(TAG, "onItemSelected: selected" + directories.get(position));

            setGridView(directories.get(position));
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });
}

private void setGridView(String selectedDir){
    Log.d(TAG, "setGridView: Dir chosen");
    final ArrayList<String> imageURL = FileSearch.getImagesByBucket(getActivity() ,selectedDir);

    int gridWidth = getResources().getDisplayMetrics().widthPixels;
    int imageWidth = gridWidth/NUM_GRID_COLOUMN;
    gridView.setColumnWidth(imageWidth);

    GridImageAdapter adapter = new GridImageAdapter(getActivity() , R.layout.grid_image_layout ,append , imageURL);
    gridView.setAdapter(adapter);
}
0

There are 0 best solutions below