【发布时间】:2020-08-19 21:57:31
【问题描述】:
我正在尝试更新文档/文件的最后修改日期,但我收到“UnsupportedOperationException:不支持更新”
重现步骤:
- 选择文档树
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, 1972);
- 在选择的目录中创建一个新文档的活动结果:
Uri treeUri = resultData.getData();
String treeDocumentId = DocumentsContract.getTreeDocumentId(treeUri);
treeUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, treeDocumentId);
Uri uri = DocumentsContract.createDocument(getContentResolver(), treeUri, "text/plain", "test.txt");
- 尝试更新文档/文件的最后修改日期
ContentValues values = new ContentValues();
values.put(DocumentsContract.Document.COLUMN_LAST_MODIFIED, 1592143965000L);
getContentResolver().update(uri, values, null, null);
也尝试插入,但结果始终相同:
Caused by: java.lang.UnsupportedOperationException: Update not supported
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:172)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.update(ContentProviderNative.java:578)
at android.content.ContentResolver.update(ContentResolver.java:2009)
有没有人遇到同样的问题,各自找到了解决这个问题的方法?
【问题讨论】:
-
我认为当您修改文档内容时,该值应该由文档提供者处理。您是否遇到了提供者不自行更新此值的问题?
-
感谢您的反馈。我已经实现了SFTP Server,并且在上传文件时我想保留时间戳(在某些情况下)。使用良好的旧 java.io.File 我可以设置最后修改的时间戳,但最近我必须/必须实现范围存储,并且我遇到了无法找到如何设置最后修改的时间戳的问题。
-
是的,我不认为范围存储真的是为此而设计的。最简单的思考方式:使用
DocumentsContract,就好像您正在与设备上的文件服务器交谈。文件服务器将负责维护这样的时间戳,并且很可能不会公开任何“将时间戳设置为任意值”API。 -
嗯,我认为 Scoped Storage 在这种情况下设计得并不好。并将其视为文件服务器,如果设置时间戳真的很危险,那么文件服务器可能会要求提升权限。我见过很多文件服务器和文件系统,范围存储确实不是一个好的解决方案。除此之外,我还需要重写我的 java.io.File 和 java.io.RandomAccessFile 代码,如果没有 Google 方面的太多指导/支持,这很痛苦。抱歉有点跑题了。
-
“那么文件服务器可以要求提升权限”——在我的类比中,您的应用程序不是文件服务器。
DocumentsProvider是文件服务器。它有权将上次修改的时间戳调整为任意值,但它可能不向客户端提供这种能力。