Не находятся картинки в указанной директории
Я пишу приложение, которое при переходе с одной активити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">