1

根据https://developer.android.com/training/data-storage/shared/documents-files#use-cases,一旦 I 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");
}

*(请注意,这是在 Emulator Android Q 上,我没有物理 Q 设备)

是的,READ_EXTERNAL_STORAGE并且WRITE_EXTERNAL_STORAGE被授予,并且也尝试过android:requestLegacyExternalStorage="true"

正如预期的那样,执行此操作的旧方法也不起作用:

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

(当然,当我切换回 时targetSdk 28,上述所有操作都会再次起作用。)

我是否缺少其他一些 API/方法?谢谢!

编辑:添加query代码

4

0 回答 0