繁体   English   中英

如何列出 android 10 上的所有 pdf 文件?

[英]How to list all pdf files on android 10?

由于更改与访问共享存储的授权相关,因此似乎不再可能通过这种方法搜索 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 以递归方式扫描共享存储的所有树,这在我看来资源非常昂贵且荒谬。

有人有其他想法吗?

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

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

 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;
}

您需要像这样调用 function:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM