【问题标题】:DocumentsContract.copyDocument() always failsDocumentsContract.copyDocument() 总是失败
【发布时间】:2021-03-28 13:57:35
【问题描述】:
final String AUTHORITY = "com.android.externalstorage.documents";

Uri roottree  = DocumentsContract.buildTreeDocumentUri(AUTHORITY,"primary:");
Uri sourceuri = DocumentsContract.buildDocumentUriUsingTree(roottree,DocumentsContract.geTreeDocumentId(roottree) + "Folder1");
Uri TargetUri = DocumentsContract.buildDocumentUriUsingTree(roottree,DocumentsContract.getTreeDocumentId(roottree) + "Folder2");
Uri resulturi = DocumentsContract.copyDocument(myContentResolver,sourceuri,TargetUri);

将 Folder1 复制到 Folder2 总是返回 null。 CreateDocument、DeleteDocument 甚至 MoveDocument 都可以正常工作。

【问题讨论】:

  • 您不太可能有权使用由硬编码的权限和名称创建的 Uri 值。
  • 先生,您能再解释一下吗?
  • 您必须具有读写文档和树的权限。您的应用只能使用存储访问框架(例如 ACTION_OPEN_DOCUMENT_TREE)获得该权限。而且,如果你使用这些,你会得到 Uri 值来使用,而不是像你在这里做的那样需要硬编码。
  • 先生,我有权使用以下代码: Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, docUri);意图.addFlags(意图.FLAG_GRANT_READ_URI_PERMISSION);意图.addFlags(意图.FLAG_GRANT_WRITE_URI_PERMISSION); startActivityForResult(intent, 1);并且创建、删除和移动操作正在成功运行。
  • 我对 DocumentsContract.copyDocument 也有类似的问题。每次我的程序崩溃时:“java.lang.UnsupportedOperationException:不支持复制”下面列出的古玩事物都可以正常工作! DocumentsContract.moveDocument DocumentsContract.deleteDocument DocumentsContract.renameDocument 为什么支持文档移动、删除和重命名,但不支持复制?任何人都可以在这个问题上帮助我吗?任何提示将不胜感激。

标签: android document


【解决方案1】:

我相信这是一个故意的错误。 它不起作用,您需要重建该功能。 这是一个简单的示例:

public boolean copyFileUri(Uri FilePath, Uri ToFolder, String Name){boolean done=true;
    try {
        InputStream in = this.getContentResolver().openInputStream(FilePath);
        Uri uriOut=DocumentsContract.createDocument(getContentResolver(), ToFolder,  "text/plain", Name );
        OutputStream out = new FileOutputStream(getContentResolver().openFileDescriptor(uriOut, "w").getFileDescriptor());
        Uri uRename=DocumentsContract.renameDocument(getApplicationContext().getContentResolver(), uriOut, Name );
        if (uRename==null){/*RENAME WITH WHILE COUNTER*/}
        try { byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } } catch(Exception e){done=false;}
        out.close(); in.close();
    } catch(Exception e){done=false;} return done;      
}

请注意,您需要为这些案例DIY附加功能:

  • 目标文件夹有同名文件,需要添加重命名计数器或覆盖旧文件的开关。
  • 如果要复制文件夹,添加会稍微复杂一点:
    • 检测 Uri 是文件夹还是普通文件
    • 创建文件夹
    • 扫描文件
    • 扫描时递归调用自身,以便扫描整个树。

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多