簡體   English   中英

DocumentsContract.copyDocument() 總是失敗

[英]DocumentsContract.copyDocument() always fails

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 都可以正常工作。

我相信這是一個故意的錯誤。 它不起作用,您需要重建 function。 這是簡單的示例:

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 額外的 function:

  • 目標文件夾有同名文件,您需要添加重命名計數器或覆蓋舊文件的開關。
  • 如果要復制文件夾,添加會稍微復雜一點:
    • 檢測 Uri 是文件夾還是普通文件
    • 創建文件夾
    • 掃描文件
    • 掃描時遞歸調用自身,以便掃描整個樹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM