2015-05-23 2 views
4

Я создаю обновление для своего приложения, в нем у меня есть папка с сохраненными изображениями, которую я хотел бы отображать в GridView. Я уже использую Ion library. У создателя библиотеки (Koush Dutta) уже есть образец, который делает то, что я хочу, и отображает все изображения с SD Card in a GridView..Получить путь к MediaStore для конкретной папки

Что я хочу сделать, это отображать только изображения из определенной папки на моей SD-карте (называемые комиксами) в GridView. Я использую код непосредственно из примера выше, только изменяя некоторые имена.

Моя проблема заключается в том, что я не могу получить только изображения с SD-карты в GridView, в настоящее время он получает все изображения с SD-карты. Я хочу только из папки/SDCard/Комиксы/

Код

public class SavedComics extends Activity { 
    private MyAdapter mAdapter; 

    // Adapter to populate and imageview from an url contained in the array adapter 
    private class MyAdapter extends ArrayAdapter<String> { 
     public MyAdapter(Context context) { 
      super(context, 0); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // see if we need to load more to get 40, otherwise populate the adapter 
      if (position > getCount() - 4) 
       loadMore(); 

      if (convertView == null) 
       convertView = getLayoutInflater().inflate(R.layout.image, null); 

      // find the image view 
      final ImageView iv = (ImageView) convertView.findViewById(R.id.comic); 

      // select the image view 
      Ion.with(iv) 
      .centerCrop() 
      .error(R.drawable.error) 
      .load(getItem(position)); 

      return convertView; 
     } 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.gallery); 

     int cols = getResources().getDisplayMetrics().widthPixels/getResources().getDisplayMetrics().densityDpi * 2; 
     GridView view = (GridView) findViewById(R.id.results); 
     view.setNumColumns(cols); 
     mAdapter = new MyAdapter(this); 
     view.setAdapter(mAdapter); 

     loadMore(); 
    } 

    Cursor mediaCursor; 
    public void loadMore() { 
     if (mediaCursor == null) { 
      mediaCursor = getContentResolver().query(MediaStore.Files.getContentUri("external"), null, null, null, null); 
     } 

     int loaded = 0; 
     while (mediaCursor.moveToNext() && loaded < 10) { 
      // get the media type. ion can show images for both regular images AND video. 
      int mediaType = mediaCursor.getInt(mediaCursor.getColumnIndex(MediaStore.Files.FileColumns.MEDIA_TYPE)); 
      if (mediaType != MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE 
       && mediaType != MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO) { 
       continue; 
      } 

      loaded++; 

      String uri = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Files.FileColumns.DATA)); 
      File file = new File(uri); 
      // turn this into a file uri if necessary/possible 
      if (file.exists()) 
       mAdapter.add(file.toURI().toString()); 
      else 
       mAdapter.add(uri); 
     } 
    } 
} 

Я попробовал несколько вещей, один нечто like this answer:

getContentResolver().query(
        uri1, Selection, 
        android.provider.MediaStore.Audio.Media.DATA + " like ? ", 
        new String[] {str}, null); 

ответ

6

Я просто понял это с помощь от this answer.

Выключает все, что вам нужно сделать, это использовать этот код ниже, чтобы получить курсор, и он будет загружать только изображения из папки /sdcard/comics/.

Обратите внимание, что я тестировал это с помощью библиотеки Ion и вашего кода, и это сработало для меня!

 mediaCursor = getContentResolver().query(MediaStore.Files.getContentUri("external"), 
       null, 
       MediaStore.Images.Media.DATA + " like ? ", 
       new String[] {"%comics%"}, 
       null); 
Смежные вопросы