gpt4 book ai didi

Android SAF,无法复制文件,未设置 FLAG_SUPPORTS_COPY

转载 作者:行者123 更新时间:2023-12-05 00:03:18 30 4
gpt4 key购买 nike

我正在尝试使用 DocumentsContract.copyDocument(ContentResolver, Uri, Uri) 在 Android 中使用 SAF 框架复制文档但是这不起作用,android 返回错误“无法复制文档”。

通过缩小问题范围,FLAG_SUPPORTS_COPY 在该文档上被关闭(根据 DocumentsContract.Document#COLUMN_FLAGS )(COLUMN_FLAGS 值为十进制的 326)。所以这解释了错误。

但是允许移动文档(标记 FLAG_SUPPORTS_MOVEon)并且在调用 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com