Не находятся картинки в указанной директории

Я пишу приложение, которое при переходе с одной активити2 на активити 3 должно выгружать картинки и их названия из указанной директории и отображать их на активити 3 в виде GridView. При запуске кода на андройд 7 все работает, однако, когда запускаю на андройд 10, все крашится. Пробовала делать двумя способами: через FileVisitor и c помощью folder.listFiles().

File folder = new File(directory);
if (folder.isDirectory() && folder.exists()) {
    ArrayList<File> imagesFromDirectory = new ArrayList<>(Arrays.asList(Objects.requireNonNull(folder.listFiles()))); //list with files to show in imageView
    ArrayList<String> fileNames = new ArrayList<>(Arrays.asList(Objects.requireNonNull(folder.list()))); //list with names to show in textView
    if (!(imagesFromDirectory.isEmpty())) {
        for (int i = 0; i < imagesFromDirectory.size(); i++) {
            Uri imageURI = Uri.fromFile(imagesFromDirectory.get(i));
            if (imagesFromDirectory.get(i).getName().endsWith(".jpg") || imagesFromDirectory.get(i).getName().endsWith(".png") || imagesFromDirectory.get(i).getName().endsWith(".jpeg")) {
                exampleList.add(new ExampleElement(imageURI, fileNames.get(i), imagesFromDirectory.get(i).getAbsolutePath()));
            }
        }
    } else {
        Toast.makeText(this, "There is no images in this folder", Toast.LENGTH_SHORT).show();
    }
} else {
    Toast.makeText(this, "There is no such directory", Toast.LENGTH_SHORT).show();
}

второй вариант:

    try {
        File folder = new File(directory);
        if (folder.isDirectory() && folder.exists()) {
            FileVisitor fileVisitor = new FileVisitor();
            Files.walkFileTree(Paths.get(directory), fileVisitor);
        } else {
            Toast.makeText(this, "There is no such directory", Toast.LENGTH_SHORT).show();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (!(images.isEmpty())) {
        for (int i = 0; i < images.size(); i++) {
            Uri imageURI = Uri.fromFile(images.get(i).toFile());
            exampleList.add(new ExampleElement(imageURI, images.get(i).getFileName().toString(), images.get(i).toAbsolutePath().toString()));
        }
    } else {
        Toast.makeText(this, "There is no images in this folder", Toast.LENGTH_SHORT).show();
    }

public static class FileVisitor extends SimpleFileVisitor<Path> {


    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        if (Files.isRegularFile(file)) {
            if (file.getFileName().endsWith(".jpg") || file.getFileName().endsWith(".png")) {
                images.add(file);
            }
        }
        return FileVisitResult.CONTINUE;
    }

По итогу первый выбрасывает IOException, а второй NullPointerException. Полагаю, что проблема может быть связана с недостатком разрешений. Хотя при переходе на активити 3 приложение запрашивает разрешение на доступ к медиа файлам.

public void goToActivity2(View view) {

    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(MainActivity.this, "You have already granted this permission", Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(MainActivity.this, Activity2.class);
        startActivity(intent);
    } else {
        requestStoragePermission();
    }
}

private void requestStoragePermission() {
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
        new AlertDialog.Builder(this)
                .setTitle("Permission needed")
                .setMessage("This permission is needed to show images to the activity 2")
                .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
                    }
                })
                .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .create().show();
    } else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == STORAGE_PERMISSION_CODE) {
        if (grantResults.length > 0 && grantResults[0] == (PackageManager.PERMISSION_GRANTED)) {
            Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(MainActivity.this, Activity2.class);
            startActivity(intent);
        } else {
            Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
        }
    }
}

Ответы (1 шт):

Автор решения: Circassian

Добавь в манифест

<application
    ...
    android:requestLegacyExternalStorage="true">
→ Ссылка