Отображение изображений из определенной папки на SD-карте с использованием gridview
Я пытаюсь создать gridview, который загружается изображениями из определенной папки, которая находится на SDCard. Путь к папке известен («/ sdcard / pictures»), но в примерах, которые я видел в Интернете, я не знаю, как и где указать путь к папке с картинками, с которой я хочу загрузить изображения. Я прочитал десятки учебных пособий, даже учебник HelloGridView на developer.android.com, но эти учебники не учат меня тому, что я ищу.
Каждый учебник, который я прочитал до сих пор, имеет:
A) назвал изображения в виде Drawable из папки / res и поместил их в загружаемый массив, не используя SDCard вообще.
- .NET. Получить протокол, хост и порт.
- Как заставить Uri.EscapeDataString соответствовать RFC 3986
- Преобразовать файл: Uri в файл на Android
- Недопустимый URI: формат URI не может быть определен
- Почему Firefox использует протокол / схему chrome: // в URL-адресах?
B) Доступ ко всем изображениям на SD-карте с помощью MediaStore, но не указывая, как установить путь к папке, которую я хочу отобразить
или
C) Предлагается использовать BitmapFactory, о котором я не имею ни малейшего понятия, как использовать.
Если я пойду об этом неправильно, сообщите мне и направьте меня к правильному методу делать то, что я пытаюсь сделать.
- Назначить BitmapImage из Resource.resx в Image.Source?
- Создать «файл: //» URI в проводнике Windows
- Как получить полный путь к файлу из URI
- Преобразование String в Uri
- Как программно удалить файлы на Android?
- Разбирайте строку URI в коллекцию именных значений
- Как передать URI на намерение?
- Spider только для веб-сайтов и URL-адресов возврата
Хорошо, после многих повторений попытки, у меня наконец есть пример, который работает, и я думал, что поделюсь им. Мой пример запрашивает изображения 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 (но вам нужно изменить код)