2016-04-05 3 views
1

J'utilise Cursor pour obtenir les images de la galerie et obtenir toutes les images de la galerie, est-il possible d'obtenir seulement quelques images récentes, comme les 20 dernières images capturées. Un autre problème, je suis confronté est que les images viennent d'un ordre plus ancien, je veux obtenir l'image dans l'ordre inverse (nouveau à plus vieux).Obtenir les images récentes de la galerie du curseur en utilisant ContentResolver

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

Mon code pour obtenir l'image:

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(); 
} 

Mon Adaptateur:

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; 
} 
+0

https://github.com/amirarcan e/recent-images –

+0

Merci mec je vais vérifier ça :) – HAXM

Répondre

2

L'ordre par argument query(), par la documentation, est formaté comme ordre SQL par déclaration. Si vous voulez que les valeurs dans l'ordre décroissant, par opposition à la valeur par défaut par ordre croissant, faites ceci:

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

Mais vous spécifiquement posé des questions sur l'utilisation de la date de la commande, de sorte que vous voulez sans doute ceci:

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

Merci l'homme pouvez-vous donner une solution pour obtenir seulement 20 images capturées récemment du curseur, comme mon problème principal est d'obtenir seulement quelques images, quand j'ai beaucoup des images dans la galerie de l'application va lent sometines, je suppose que la demande pour seulement les images fiew permettra d'éviter la latence – HAXM

+0

http://stackoverflow.com/questions/12640480/specifying-limit-offset-for-contentprovider-queries –

+0

J'ai essayé d'utiliser il, mais si je vais utiliser que je dois supprimer OrderBy et mon application est en panne pour l'utiliser toute meilleure solution sera appréciée. – HAXM

1

En plus de la réponse de Doug, si vous ne voulez que le 20 dernier avec le orderBy, vous pouvez le faire:

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

+0

Merci pour votre contribution – HAXM