- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 DocumentsContract.copyDocument(ContentResolver, Uri, Uri) 在 Android 中使用 SAF 框架复制文档但是这不起作用,android 返回错误“无法复制文档”。
通过缩小问题范围,FLAG_SUPPORTS_COPY
在该文档上被关闭(根据 DocumentsContract.Document#COLUMN_FLAGS )(COLUMN_FLAGS 值为十进制的 326)。所以这解释了错误。
但是允许移动文档(标记 FLAG_SUPPORTS_MOVE
是 on)并且在调用 DocumentsContract.moveDocument(ContentResolver, Uri, Uri, Uri) 时文件真的被移动了)
已通过 Intent.ACTION_OPEN_DOCUMENT_TREE
授予对文档树(驱动器的根目录和 DCIM 文件夹)的访问权限
为什么将文档的 FLAG_SUPPORTS_COPY
设置为 false?我错过了什么吗?
注意:我相信我满足了这篇文章的要求https://stackoverflow.com/a/58147682/15401262
谢谢
代码(java)
// docFilesToProcess if of type "DocumentFile[]" and contains "regular files, like images" (not directories).
// Create destination dir
Uri destUri = DocumentsContract.createDocument(this.getContentResolver(), docFilesToProcess[i].getParentFile().getUri(), DocumentsContract.Document.MIME_TYPE_DIR, "destDir");
Log.i("M", "destUri: "+ destUri.toString());
// Create document
Uri docToMove = DocumentsContract.createDocument(this.getContentResolver(), docFilesToProcess[i].getParentFile().getUri(), "text/plain", "text");
Log.i("M", "docToMove: "+ docToMove.toString());
// copy document
DocumentsContract.copyDocument(this.getContentResolver(), docToMove, destUri);
输出
I/M: destUri: content://com.android.externalstorage.documents/tree/primary%3ADCIM/document/primary%3ADCIM%2FdestDir
I/M: docToMove: content://com.android.externalstorage.documents/tree/primary%3ADCIM/document/primary%3ADCIM%2Ftext.txt
W/DocumentsContract: Failed to copy document
java.lang.UnsupportedOperationException: Copy not supported
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:172)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.call(ContentProviderNative.java:658)
at android.content.ContentResolver.call(ContentResolver.java:2042)
at android.provider.DocumentsContract.copyDocument(DocumentsContract.java:1442)
at com.example.exifthumbnailadder.MainActivity.addThumbs(MainActivity.java:1036)
at java.lang.reflect.Method.invoke(Native Method)
持久权限请求
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION
| Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
最佳答案
一般来说,您永远不能依赖任何 SAF 提供商来实现任何可选功能。您应该检查该功能是否受支持,并且您应该有一个可行的后备计划以备不时之需。
ContentResolver cr = getContentResolver();
if((flags & FLAG_SUPPORTS_MOVE) == FLAG_SUPPORTS_MOVE)
Uri newDoc = DocumentsContract.copyDocument(cr, docToCopy, destDir);
else {
Uri newDoc = DocumentsContract.createDocument(cr, destDir, mimeType, name);
manuallyCopyBytes(docToCopy, newDoc);
}
让提供者有机会这样做很重要,因为像 Google Drive 这样的东西可能能够在设备和服务器上单独执行复制,而不是在设备上复制它然后必须上传整个再次发送给服务器。
关于Android SAF,无法复制文件,未设置 FLAG_SUPPORTS_COPY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66660155/
我正在尝试使用 DocumentsContract.copyDocument(ContentResolver, Uri, Uri) 在 Android 中使用 SAF 框架复制文档但是这不起作用,an
我是一名优秀的程序员,十分优秀!