Отображение изображений из определенной папки на SD-карте с использованием gridview

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

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

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

B) Доступ ко всем изображениям на SD-карте с помощью MediaStore, но не указывая, как установить путь к папке, которую я хочу отобразить

или

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

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

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

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

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 для фильтрации списка файлов изображений в определенной папке.

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

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

Создайте / добавьте вектор в переменные classа (чтобы сохранить список ImageViews):

 private Vector mySDCardImages; 

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

 mySDCardImages = new Vector(); 

Создайте способ загрузки изображений:

 List drawablesId = new ArrayList(); 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. Доступно для обоих методов classа.)

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

В вашем случае 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 } 

Не время проверять это, но должно работать 😉

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

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

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

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

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

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

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

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

  • Способ определения, является ли строка пути локальной или удаленной машиной
  • Получить имя файла и путь от URI от медиастора
  • Spring / Rest @PathVariable кодировка символов
  • Как проверить, является ли строка допустимым URL-адресом HTTP?
  • Используйте URI-конструктор в Android или создайте URL-адрес с переменными
  • как получить uri ресурса изображения в android
  • В чем разница между URI, URL-адресом и URN?
  • Получить имя файла из строки URI в C #
  • Преобразовать путь к файлу URI?
  • Android: Получение URI файла из URI содержимого?
  • Android: как анализировать URL-адрес String с пробелами для URI-объекта?
  • Давайте будем гением компьютера.