Получение последних изображений из галереи из курсора с помощью ContentResolver

Я использую Cursor для получения изображений из галереи и получения всех изображений из галереи, есть ли способ получить только несколько последних изображений, например последние 20 захваченных изображений.

Еще одна проблема, с которой я сталкиваюсь, заключается в том, что изображения идут от более старого к новому порядку, я хочу получить изображение в обратном порядке (от нового к старому).

final String[] columns = { MediaStore.Images.Media.DATA,
                MediaStore.Images.Media._ID };
final String orderBy = MediaStore.Images.Media._ID;

Мой код для получения изображения:

public void getImg(){
    Cursor imagecursor = getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
            null, orderBy);

    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);
    }
    GridView imagegrid = (GridView) findViewById(R.id.PhoneImageGrid);
    imageAdapter = new ImageAdapter();
    imagegrid.setAdapter(imageAdapter);
    imagecursor.close();
}

Мой адаптер:

public class ImageAdapter extends BaseAdapter {
    private LayoutInflater mInflater;

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

    public int getCount() {
        return count;
    }

    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);
            holder.checkbox = (CheckBox) convertView
                    .findViewById(R.id.itemCheckBox);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.checkbox.setId(position);
        holder.imageview.setId(position);
        holder.checkbox.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                CheckBox cb = (CheckBox) v;
                int id = cb.getId();
                if (thumbnailsselection[id]) {
                    cb.setChecked(false);
                    thumbnailsselection[id] = false;
                } else {
                    cb.setChecked(true);
                    thumbnailsselection[id] = true;
                }
            }
        });

        holder.imageview.setImageBitmap(thumbnails[position]);
        holder.checkbox.setChecked(thumbnailsselection[position]);
        holder.id = position;
        return convertView;
    }
}

class ViewHolder {
    ImageView imageview;
    CheckBox checkbox;
    int id;
}

person HAXM    schedule 05.04.2016    source источник
comment
github.com/amirarcane/recent-images   -  person Amirhossein Naghshzan    schedule 23.05.2016
comment
Спасибо, чувак, я проверю это :)   -  person HAXM    schedule 23.05.2016


Ответы (2)


Порядок по аргументам для query(), в соответствии с документацией, отформатирован как оператор SQL в порядке следования. Если вам нужны значения в порядке убывания, а не в порядке возрастания по умолчанию, сделайте следующее:

final String orderBy = MediaStore.Images.Media._ID + " DESC";

Но вы специально спросили об использовании даты в качестве порядка, поэтому вы, вероятно, захотите этого вместо этого:

final String orderBy = MediaStore.Images.Media.DATE_ADDED + " DESC";
person Doug Stevenson    schedule 05.04.2016
comment
Спасибо, чувак, можешь ли ты дать решение, чтобы получить только 20 последних захваченных изображений с курсора, так как моя основная проблема состоит в том, чтобы получить только несколько изображений, когда у меня много изображений в галерее, приложение иногда работает медленно, я думаю, запрашивая только несколько изображения предотвратят задержку - person HAXM; 05.04.2016
comment
Я пытался использовать его, но если я буду использовать его, мне придется удалить orderBy, и мое приложение выйдет из строя, чтобы использовать его, любое лучшее решение будет оценено. - person HAXM; 05.04.2016

В дополнение к ответу Дуга, если вам нужны только 20 последних с orderBy, вы можете сделать это:

final String orderBy = MediaStore.Images.Media.DATE_ADDED + " DESC LIMIT 20";

person mVck    schedule 23.12.2016