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
код