Search code examples
fileandroid-cursormediastoreandroid-10.0android-external-storage

How to get all PDF files Uri with FileName from external storage in Android 10 using java


I am trying to list all the PDF files from the external storage created by the app. How to list pdf files in the App after iterating through cursor?

private void getExternalPDFFiles() {

    ContentResolver cr = getContentResolver();
    Uri uri = MediaStore.Files.getContentUri("external");

    // every column, although that is huge waste, you probably need
    // BaseColumns.DATA (the path) only.
    String[] projection = null;

    // exclude media files, they would be here also.
    String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "="
            + MediaStore.Files.FileColumns.MEDIA_TYPE;
    String[] selectionArgs = null; // there is no ? in selection so null here

    String sortOrder = null; // unordered
    //        Cursor allNonMediaFiles = cr.query(uri, projection, selection, selectionArgs, sortOrder);


    // only pdf
    String selectionMimeType = MediaStore.Files.FileColumns.MIME_TYPE + "=?";
    String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("pdf");
    String[] selectionArgsPdf = new String[]{mimeType};
    Cursor cursor = cr.query(uri, projection, selectionMimeType, selectionArgsPdf, sortOrder);
    assert cursor != null;
    if (cursor.moveToFirst()) {
        while (!cursor.isAfterLast()) {
            //your code to implement
            Log.d("TAG", cursor.getColumnNames().toString());
            cursor.moveToNext();
        }
    }
    Log.d("TAG", cursor.getCount() + "");
    Log.d("TAG", cursor.getColumnCount() + "");
    cursor.close();

}

Solution

  • Get all file list with Uri and FileName in Android-10 and above:

    class FileModel {
        String displayName;
        Uri fileUri;
    
        FileModel(String displayName, Uri fileUri) {
            this.displayName = displayName;
            this.fileUri = fileUri;
        }
    }
    

    ...

    private ArrayList<FileModel> getExternalPDFFileList() {
    
        ContentResolver cr = getContentResolver();
        Uri uri = MediaStore.Files.getContentUri("external");
    
        String[] projection = {MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.DISPLAY_NAME};
        String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "="
                + MediaStore.Files.FileColumns.MEDIA_TYPE;
        String[] selectionArgs = null;
        String selectionMimeType = MediaStore.Files.FileColumns.MIME_TYPE + "=?";
        String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("pdf");
        String[] selectionArgsPdf = new String[]{mimeType};
    
        Cursor cursor = cr.query(uri, projection, selectionMimeType, selectionArgsPdf, null);
    
        assert cursor != null;
        ArrayList<FileModel> uriList = new ArrayList<>();
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            int columnIndex = cursor.getColumnIndex(projection[0]);
            long fileId = cursor.getLong(columnIndex);
            Uri fileUri = Uri.parse(uri.toString() + "/" + fileId);
            String displayName = cursor.getString(cursor.getColumnIndex(projection[1]));
            uriList.add(new FileModel(displayName, fileUri));
        }
        cursor.close();
        return uriList;
    }