Как запросить все изображения из пути getExternalFilesDir через MediaStore

Я пишу приложение для камеры и галереи, следуя официальной документации Google. Проблема в том, что в основном он сфокусирован на том, как сделать снимок и как сохранить его в памяти. Я сохраняю их во внешней памяти приложения через getExternalFilesDir().

Что я сейчас пытаюсь сделать - это просто запросить каталог, в котором сохранены сделанные фотографии, через MediaStore, чтобы отобразить все изображения, находящиеся там, в виде переработчика. Но я не могу найти нигде объяснения о том, как сделать поиск. Что-то не так с Ури, что я, вероятно, не очень хорошо понял, и я не знаю, как решить. Даже здесь https://developer.android.com/training/data-storage/files в статье говорится только о сохранении файлов в различных вариантах хранения, но не о их извлечении.

Вот код того, как я сохраняю файлы:

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";

    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",   /* suffix */
            storageDir     /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    currentPhotoPath = image.getAbsolutePath();
    return image;
}

Это функция, которая фактически отправляет намерение (а затем onActivityResult обрабатывает возвращаемые данные):

private void dispatchTakePictureIntent() {
    final String TAG = "dispatchTakePic: ";
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {

        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
            Log.e(TAG, "Error while creating a file");
            ex.printStackTrace();
        }

        // Continue only if the File was successfully created
        // Authority has to be exactly like in manifest
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(
                    this,
                    "com.example.android.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }
}

Вот код, где я пытаюсь получить информацию о сделанных фотографиях:

private void populatePhotoArray() {
    final String TAG = "popPhotoArray: ";
    ContentResolver contentResolver = getContentResolver();
    String photo_id, photo_title, photo_path = "";

    final String[] PHOTOGRAPHS_PROJECTION = {
            MediaStore.Images.Media._ID,
            MediaStore.Images.Media.TITLE,
            MediaStore.Images.Media.DATA};

    File photographsDirectory = getExternalFilesDir(Environment.DIRECTORY_MOVIES);
    Uri photographsUri = Uri.fromFile(photographsDirectory);
    //Uri photographsUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    //Uri photographsUri = MediaStore.Images.Media.INTERNAL_CONTENT_URI;
    String sortOrder = MediaStore.Images.Media.DATE_ADDED + " DESC";
    final Cursor cursor = contentResolver.query(
            photographsUri,
            PHOTOGRAPHS_PROJECTION,
            null,
            null,
            sortOrder);

    Log.d(TAG, "created the projection");

    if (cursor != null && cursor.getCount() > 0) {
        while (cursor.moveToNext()) {
            photo_id = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID));
            photo_title = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.TITLE));
            photo_path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));

            // save to photo list
            applicationPhotosList.add(new Photographs(photo_id, photo_title, photo_path));
            Log.d(TAG, "new photo added");
        }
        cursor.close();
        Log.d(TAG, "Photo array filled up");
    }
    else if (cursor == null){
        Log.d(TAG, "No photos present, cursor is null");
        Toast.makeText(this, "No photos present", Toast.LENGTH_SHORT).show();
    }

Похоже, попытка преобразовать путь getExternalFileDir() в Uri не работает. Курсор пуст. Но в MediaStore есть только MediaStore.Images.Media.EXTERNAL_CONTENT_URI, и это не подходит, поскольку оно запрашивает всю память устройства, а мне нужен только тот конкретный каталог, в котором мое приложение сохраняет сделанные снимки. Что мне не хватает? Это не может быть так сложно, верно?

0 ответов

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

    private fun getAllShownImagesPath(): ArrayList<String> {

    var filePath: ArrayList<String> = ArrayList<String>()
    val path = File(getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).path, "BacFo Camera")
    if (path.exists()) {

        for (i in path.list().iterator()) {

            filePath?.add("" + path.toString() + "/" + i)
        }
    }

    return filePath!!
    }

`В"fileNames"у вас есть путь ко всем изображениям или видео, которые вы сохранили в определенной папке

Другие вопросы по тегам