Отображение изображений из определенной папки на SDCard с использованием вида сетки - PullRequest
9 голосов
/ 18 февраля 2011

Я пытаюсь создать сетку, загруженную изображениями из определенной папки, которая находится на SDCard. Путь к папке известен ("/ sdcard / pictures"), но в примерах, которые я видел в Интернете, я не уверен, как или где указать путь к папке с картинками, из которой я хочу загрузить изображения. Я прочитал десятки учебников, даже учебник HelloGridView на developer.android.com, но эти учебники не учат меня тому, что я ищу.

В каждом уроке, который я прочитал, есть либо:

A) вызывал изображения как Drawable из папки / res и помещал их в загружаемый массив, вообще не используя SDCard.

B) Получил доступ к всем изображениям на SDCard, используя MediaStore, но не указав, как указать путь к папке.

или

C) Предложил использовать BitmapFactory, и я не имею ни малейшего понятия, как его использовать.

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

Ответы [ 6 ]

15 голосов
/ 23 августа 2011

Хорошо, после многих итераций попыток у меня наконец-то появился пример, и я решил поделиться им. Мой пример запрашивает изображения MediaStore, затем получает миниатюру для каждого изображения для отображения в виде. Я загружаю свои изображения в объект галереи, но для работы этого кода это не обязательно:

Убедитесь, что у вас есть Cursor и int для индекса столбца, определенного на уровне класса, чтобы ImageAdapter Галереи имел к ним доступ:

private Cursor cursor;
private int columnIndex;

Сначала получите курсор идентификаторов изображений, расположенных в папке:

Gallery g = (Gallery) findViewById(R.id.gallery);
// request only the image ID to be returned
String[] projection = {MediaStore.Images.Media._ID};
// Create the cursor pointing to the SDCard
cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        projection, 
        MediaStore.Images.Media.DATA + " like ? ",
        new String[] {"%myimagesfolder%"},  
        null);
// Get the column index of the image ID
columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
g.setAdapter(new ImageAdapter(this));

Затем в ImageAdapter для Галереи получите уменьшенное изображение для отображения:

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView i = new ImageView(context);
    // Move cursor to current position
    cursor.moveToPosition(position);
    // Get the current value for the requested column
    int imageID = cursor.getInt(columnIndex);
    // obtain the image URI
    Uri uri = Uri.withAppendedPath( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Integer.toString(imageID) );
    String url = uri.toString();
    // Set the content of the image based on the image URI
    int originalImageId = Integer.parseInt(url.substring(url.lastIndexOf("/") + 1, url.length()));
    Bitmap b = MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(),
                    originalImageId, MediaStore.Images.Thumbnails.MINI_KIND, null);
    i.setImageBitmap(b);
    i.setLayoutParams(new Gallery.LayoutParams(150, 100));
    i.setScaleType(ImageView.ScaleType.FIT_XY);
    i.setBackgroundResource(mGalleryItemBackground);
    return i;
}

Полагаю, самым важным разделом этого кода является managedQuery, демонстрирующий использование запросов MediaStore для фильтрации списка файлов изображений в определенной папке.

4 голосов
/ 23 июля 2011

Вам нужно сделать еще несколько шагов, чем учебник по GridView на developer.android.com. Используя следующий учебник http://developer.android.com/resources/tutorials/views/hello-gridview.html

Вы захотите добавить метод для создания ImageView файлов из вашей SD-карты:

Создание / добавление вектора к переменным вашего класса (для хранения списка ImageViews):

private Vector<ImageView> mySDCardImages;

Инициализировать вектор:

mySDCardImages = new Vector<ImageView>();

Создать метод для загрузки изображений:

List<Integer> drawablesId = new ArrayList<Integer>();
int picIndex=12345;
File sdDir = new File("/sdcard/pictures");
File[] sdDirFiles = sdDir.listFiles();
for(File singleFile : sdDirFiles)
{
   ImageView myImageView = new ImageView(context);
   myImageView.setImageDrawable(Drawable.createFromPath(singleFile.getAbsolutePath());
   myImageView.setId(picIndex);
   picIndex++;
   drawablesId.add(myImageView.getId());
   mySDCardImages.add(myImageView);
}
mThumbIds = (Integer[])drawablesId.toArray(new Integer[0]);

Затем в вашем методе ImageAdapter измените

imageView.setImageResource(mThumbIds[position]);

до

imageView.setImageDrawable(mySDCardImages.get(position).getDrawable());

Удалить из ImageAdapter инициализацию mThumbIds. (оно должно соответствовать определению mySDCardImages. Доступно для обоих методов класса.)

(Быстрая и грязная версия) Обязательно проверьте свой путь и т. Д. И поймайте все исключения.

3 голосов
/ 18 февраля 2011

В вашем случае BitmaFactory может быть хорошим способом. Пример:

File dir = new File( "/sdcard/pictures" );    
String[] fileNames = dir.list(new FilenameFilter() { 
  boolean accept (File dir, String name) {
      if (new File(dir,name).isDirectory())
         return false;
      return name.toLowerCase().endsWith(".png");
  }
});
for(string bitmapFileName : fileNames) {
  Bitmap bmp = BitmapFactory.decodeFile(dir.getPath() + "/" + bitmapFileName);
  // do something with bitmap
}

Не время, чтобы проверить это, но должно работать; -)

0 голосов
/ 07 июля 2018

для кода Kotlin см. Ответ на этот вопрос

идея также применима для Java (но вам нужно изменить код)

0 голосов
/ 03 декабря 2015

Похоже, вы хотите, чтобы пользовательские галлереи, это займет у вас много времени,

Я предлагаю вам получить Галерея пользовательских камер для вашей работы.

Вы получите фотографии / видео в виде сетки, как хотите.

0 голосов
/ 18 февраля 2011

прочитайте эту ссылку: http://androidsamples.blogspot.com/2009/06/how-to-display-thumbnails-of-images.html
показывает, как использовать mediastore и bitmapfactory.

способ выбора зависит от того, что именно вам нужно.если у вас есть статический набор изображений, гораздо лучше поместить их в списки, я думаю, потому что это быстрее, и вы не полагаетесь на SD-карту, которая может быть удалена, повреждена или файлы могут быть переименованы / удалены

, если изображения являются динамическими, тогда используйте mediastore или растровую фабрику.но имейте в виду, что помещение изображений в массив или что-то такое, что потребляет много памяти, так что вы можете получить исключение вне памяти

...