6

由于更改与访问共享存储的授权有关,因此似乎不再可能通过这种方法搜索 pdf 类型的所有文档(使用 requestLegacyExternalStorage = "false"):

ContentResolver cr = context.getContentResolver();
Uri uri = MediaStore.Files.getContentUri("external");
String[] projection = null;
String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "="
                    + MediaStore.Files.FileColumns.MEDIA_TYPE_NONE;
String[] selectionArgs = null;
String sortOrder = null;
Cursor allNonMediaFiles = cr.query(uri, projection, selection, selectionArgs, sortOrder);

检查此链接:媒体数据限制

我看到的唯一解决方案是使用 SAF 以递归方式扫描共享存储的所有树,这在我看来资源非常昂贵且荒谬。

有人有其他想法吗?

4

2 回答 2

2

范围存储的基本思想正是为了避免这种行为,您无法知道用户手机中的某个位置是否存在某些文件。您可以请求访问存储树的权限并按照您所说的扫描所有内容。即使在这种情况下,用户也可以选择与根目录不同的文件夹,因此您的应用程序将被限制在该文件夹中。这个想法可以是执行扫描,然后使用在修改树 URI 和后代时安排的作业(作业服务)来更新您的数据库。

于 2019-11-05T06:16:18.193 回答
1

如果您的项目针对 Sdk 级别 29,您应该在您的 AndroidManifest.xml 中添加标签android:requestLegacyExternalStorage="true"下的 <application>标志。

 public List<String> queryFilesFromDevice(Uri uri, String[] projection, String selection, final Context context) {
    final List<String> tempList = new ArrayList<>();
    Cursor c = context.getContentResolver().query(uri, projection,
            selection,
            null,
            null);
    if (c != null) {

        while (c.moveToNext()) {
            String path = c.getString(0);
            long size = c.getLong(1);
         // your code logic should be here
        }
        c.close();
    }
    tempList.add(path);
    return tempList;
}

你需要像这样调用函数:

String pdfExt = "_data LIKE '%.pdf'";
Uri ducumentsUri = MediaStore.Files.getContentUri("external");
String[] docsProjection ={MediaStore.Files.FileColumns.DATA,MediaStore.Images.Media.SIZE,MediaStore.Files.FileColumns.MIME_TYPE,};
queryFilesFromDevice(ducumentsUri, docsProjection, pdfExt, this);
于 2020-01-08T10:20:45.913 回答