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 总是 return 空。 CreateDocument、DeleteDocument 甚至 MoveDocument 都可以正常工作。
我相信这是一个故意的错误。
它不起作用,您需要重建该功能。
这是简单的示例:
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 是文件夹或普通文件
- 创建文件夹
- 扫描文件
- 递归在扫描时调用自身,因此它会扫描整个树。
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 总是 return 空。 CreateDocument、DeleteDocument 甚至 MoveDocument 都可以正常工作。
我相信这是一个故意的错误。 它不起作用,您需要重建该功能。 这是简单的示例:
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 是文件夹或普通文件
- 创建文件夹
- 扫描文件
- 递归在扫描时调用自身,因此它会扫描整个树。