android - 创建名称中带有“:”的文件
问题描述
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
startActivityForResult(intent, CREATE_FILE);
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (resultCode != Activity.RESULT_OK)
return;
if (requestCode == CREATE_FILE && resultData != null) {
Uri uri = resultData.getData();
if (uri != null) {
DocumentFile file = DocumentFile.fromTreeUri(getContext(), uri);
try {
DocumentFile newFile = file.createFile("text/plain", "some:file");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这导致创建一个文件some_file.txt
,因此基本上:
被替换为_
我要创建的是一个名为 的文件some:file.txt
,并且可以从手机上的 Files 应用程序手动创建:
很明显,:
字符不受限制,而且,旧的 java.io.File API 我从来没有遇到过这个问题
我也试过
Intent intent = new Intent(Intent.ACTION_GET_CONTENT)
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
.addCategory(Intent.CATEGORY_OPENABLE)
.setType("text/plain");
startActivityForResult(intent, OPEN_FILE);
并选择了手动创建some:file.txt
并记录了名称和 uri,它是正确的 ':`
Uri: content://com.android.externalstorage.documents/document/primary%3ATEST%3AS%2Fsome%3Afile.txt
File: some:file.txt
编辑:我能想到的一种解决方法是将所有文档保存到 .zip 存档中
解决方案
我怎样才能避免这种情况?
你不能。第二个参数createFile()
是“显示名称”,而不是文件名。文件提供者使用什么文件名取决于文件提供者。在您的情况下,它正在用下划线替换一些特殊字符。
推荐阅读
- python - Selenium 不会返回所需的所有元素
- python - 将输出从循环保存到不同的数据框,然后保存到 excel
- asp.net - ASP.NET 核心策略检查中缺少“aud”声明会阻止授权,但它在 id 令牌中
- linux - 关于 Linux shell 上的脚本执行权限
- javascript - Javascript - 从对象数组中减去总数的最佳逻辑/性能方面
- .net - Azure CosmosDb 参数化查询抛出“无效查询。指定的参数化查询 JSON 格式错误。”
- javascript - 使用 # 时的下拉问题。转到不在子菜单中的页面后,我无法从下拉菜单中选择任何选项
- database - 是否建议使用带有 noeviction 策略的云 redis 作为持久数据库?
- docker - 来自私有本地注册表的图像不会填充到 docker swarm 中的工作节点
- javascript - 单击时如何替换 src img (html/css 或 JS)