java - 是否可以以编程方式访问 Android Q (SDK >= 29) 上的下载文件夹?
问题描述
我想列出下载.txt
文件夹中的所有文件,然后允许用户选择一个并阅读其内容。我的是,但我遇到了这个问题,因为我的 Android 是 Q (29)。minSdkVersion
16
我尝试了什么:
显然Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
会为 SDK <= 29 解决它。但是,我没有测试它,因为我首先想查看 Android Q 的解决方案。
getExternalStoragePublicDirectory说:
当应用程序以 Build.VERSION_CODES.Q 为目标时,从此方法返回的路径不再可供应用程序直接访问。通过迁移到Context#getExternalFilesDir(String)、MediaStore或Intent#ACTION_OPEN_DOCUMENT等替代方案,应用程序可以继续访问存储在共享/外部存储上的内容。
所以:
getExternalFilesDir
返回/storage/emulated/0/Android/data/com.mypackage/files/Download
。该路径没有用,我希望它返回/storage/emulated/0/Download
,这是下载文件所在的位置。我没能用
MediaStore.Downloads
. 我检查了文档,上面写着“特别是,如果您的应用程序想要访问 MediaStore.Downloads 集合中的文件,但您的应用程序没有创建,您必须使用存储访问框架。”。所以,我认为它对我不起作用。在我的概念中,
Intent
需要Storage Access Framework
用户使用文件管理器浏览目录和文件,这不是我想要的。
简而言之:
是否可以在 Android Q (SDK >= 29) 中以编程方式列出.txt
下载的文件?如果是这样,怎么做?
解决方案
是否可以在 Android Q (SDK >= 29) 中以编程方式列出 .txt 下载的文件?
不是由其他应用程序创建的,这似乎是您的意图。
最接近的是如果您使用ACTION_OPEN_DOCUMENT_TREE
并要求用户在外部存储上打开Downloads/
树......而您不能在 Android R 上执行此操作(至少通过 DP1)。
推荐阅读
- kubernetes - 如何使用命令在 helm 3 中显示特定版本并安装特定版本的图表
- amazon-s3 - AWS lambda 触发 s3 对象推送但文件不存在
- node.js - Loopback 4 中间件未注册
- azure - 当范围不是 Azure AD 中的 Graph API 时,如何添加自定义声明并检索其作为 access_token 的一部分?
- java - 如何解析数组不是逗号分隔的 JSON 字符串?(Gson,Android 工作室)
- javascript - 如何将焦点设置到验证器函数内部验证失败的控件?
- node.js - 使用 Mongoose 进行虚拟填充
- html - TypeScript:如何在 div 中获取段落文本
- javascript - 在 React 组件之上声明通用实用程序函数与将函数声明为组件的一部分
- sql-server - 如何获取列不等于其他表列的表记录