Android Q, получите список файлов с MediaStore ContentResolver - PullRequest
0 голосов
/ 04 мая 2020

Per https://developer.android.com/training/data-storage/shared/documents-files#use -cases , как только я targetSdk 29, единственный способ получить список файлов из каталога / Downloads - использовать ACTION_OPEN_DOCUMENT_TREE, а именно:

// Using the Uri returned from Intent.ACTION_OPEN_DOCUMENT_TREE
DocumentFile dir = DocumentFile.fromTreeUri(context, uri);
DocumentFile[] files = dir.listFiles();

Это нормально, но для его выбора и утверждения требуются определенные явные действия пользователя. (хотя это будет в дальнейшем убито, если targetSdk 30 / R .., но сейчас это не главное)

Так как же это https://play.google.com/store/apps/details?id=com.google.android.apps.nbu.files в состоянии все еще получить список файлов из / Downloads без этого явного выбора / одобрения? (это также targetSdk 29)

Я попробовал эти методы, и они возвращают пустые результаты "uri empty":

// 1. uri = MediaStore.Downloads.EXTERNAL_CONTENT_URI
// 2. uri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL)
cursor = context.getContentResolver().query(
        uri, null, null, null,
        DocumentsContract.Document.COLUMN_DISPLAY_NAME + " DESC");
if (cursor != null) {
    if (cursor.moveToFirst()) {  // targetSdk 28, I get these results
        final int MAX_RESULTS = 50;
        int colCount = cursor.getColumnCount();
        int rowCount = cursor.getCount();
        peek.append("uri[").append(rowCount).append(rowCount >= MAX_RESULTS ? "+]" : "]");
        do {
            peek.append("\n=======================================");
            int colPos = cursor.getPosition();
            if (colPos >= MAX_RESULTS) break;
            for (int i = 0; i < colCount; i++) {
                String colName = cursor.getColumnName(i);
                String colVal = cursor.getString(i);
                peek.append("\n").append(colPos).append(".").append(i).append(" ")
                        .append(colName).append("=").append(colVal);
            }
        } while (cursor.moveToNext());
    } else {  // targetSdk 29, nothing from the cursor/uri
        peek.append("uri empty");
    }
} else {
    peek.append("cursor null");
}

* ( обратите внимание, что это на эмуляторе Android Q, у меня нет физического устройства Q)

И да, READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE предоставлено, а также пробовал android:requestLegacyExternalStorage="true"

И, как и ожидалось, старый способ сделать это также не работает:

File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

(Конечно, когда я снова переключаюсь на targetSdk 28, все вышеописанное снова работает.)

Мне не хватает другого API / метода? Спасибо!

РЕДАКТИРОВАТЬ: добавлено query код

...