Запрос Android 9 (Pie) ContentResolver MediaStore.Images.Media.EXTERNAL_CONTENT_URI возвращает нулевое значение для API 28 - PullRequest
0 голосов
/ 15 ноября 2018

Я получаю список всех изображений, видео и аудио файлов на устройстве. Приведенный ниже код работает нормально на всех устройствах вплоть до Android O (API 27). Но это не работает на устройствах Android Pie (API 28). Cursor возвращает ноль для query

Для изображений

String[] proj = {MediaStore.Images.Media._ID,
                    MediaStore.Images.Media.DATA,
                    MediaStore.Images.Media.TITLE,
                    MediaStore.Images.Media.SIZE
            };
ContentResolver cr = context.getContentResolver();

Cursor imagescursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    proj, null, null, "_size DESC");

Для видеофайлов

String[] proj = {MediaStore.Video.Media._ID,
                    MediaStore.Video.Media.DATA,
                    MediaStore.Video.Media.TITLE,
                    MediaStore.Video.Media.SIZE,
                    MediaStore.Video.Media.DURATION
            };
ContentResolver cr = context.getContentResolver();

Cursor videocursor = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                    proj, null, null, "_size DESC");

Для аудиофайлов

String[] proj = {MediaStore.Audio.Media._ID,
                    MediaStore.Audio.Media.DATA,
                    MediaStore.Audio.Media.DISPLAY_NAME,
                    MediaStore.Audio.Media.SIZE,
                    MediaStore.Audio.Media.DURATION};
ContentResolver cr = context.getContentResolver();

Cursor audiocursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                    proj, null, null, "_size DESC");

Пожалуйста, если кто-нибудь может мне помочь!

1 Ответ

0 голосов
/ 28 ноября 2018

Так что я могу найти обходной путь для этого.Пожалуйста, дайте мне знать, если кто-нибудь найдет лучший способ сделать это.

Шаг 1. Путь к каталогу локального хранилища

File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath());

Шаг 2. Для изображений, Видео, аудио

private ArrayList<File> allShownImagesPath = new ArrayList<>();
private ArrayList<File> allShownVideoPath = new ArrayList<>();
private ArrayList<File> allShownAudioPath = new ArrayList<>();

Шаг 3. Я вызываю этот метод в фоновом потоке

public void searchDir(File dir) {
        //audio
        String mp3 = ".mp3";
        String ogg = ".ogg";
        String aac = ".aac";
        //video
        String mp4 = ".mp4";
        String mkv = ".mkv";
        String avi = ".avi";
        String webm = ".webm";
        //images
        String webp = ".webp";
        String png = ".png";
        String jpg = ".jpg";
        String gif = ".gif";

        File[] listFile = dir.listFiles();
        if (listFile != null) {
            for (File file : listFile) {


                if (file.isDirectory()) {
                    if (!file.getName().equals("Android") && !file.isHidden()) // will skip Android folder, hidden folders
                        searchDir(file);
                } else {
                    if (!file.isHidden()) { // will skip hidden files, totally up to you
                        String name = file.getName();
                        if (name.endsWith(mp3) || name.endsWith(ogg) || name.endsWith(aac)) { //Audio file
                            allShownAudioPath.add(file);
                        } else if (name.endsWith(mp4) || name.endsWith(mkv) || name.endsWith(avi) || name.endsWith(webm)) {  //Video file
                            allShownVideoPath.add(file);
                        } else if (name.endsWith(webp) || name.endsWith(png) || name.endsWith(jpg) || name.endsWith(gif)) { //Image file
                            allShownImagesPath.add(file);
                        }
                    }
                }
            }
        }
    }

Конечно, вы можете использовать больше фильтров длянайти различные файлы, такие как .pdf, .docx и т. д.

Не имеет отношения к вопросу, но вы можете отсортировать файлы.

if (allShownImagesPath.size() > 0){

      File[] sortedImgFiles = allShownImagesPath.toArray(new File[0]);
      Arrays.sort(sortedImgFiles, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);
}
...