在 Android 11 的 SAF 中,使用本地的 fdopendir + readdir 方法时,可能会发现无法显示完整的文件列表。这是因为 SAF 在处理文件访问时使用了沙盒机制,只限制了应用程序路径的访问。因此,无法访问其他应用程序或系统文件路径。为了解决这个问题,可以使用 SAF 的 DocumentFile API 来完成文件访问和操作。
以下是一个示例代码,使用 DocumentFile API 获取完整的文件列表:
Uri uri = intent.getData();// SAF 返回的该目录的Uri
DocumentFile documentFile = DocumentFile.fromTreeUri(context, uri);
if (documentFile != null && documentFile.isDirectory()) {
for (DocumentFile file : documentFile.listFiles()) {
Log.i(TAG, "filename: " + file.getName());
}
}
通过这种方法,即可获取到完整的文件列表。同时,还需注意在使用 SAF 时,需要在应用程序的清单文件中添加合适的权限声明。