【发布时间】:2017-08-21 15:30:15
【问题描述】:
我正在尝试在我的应用中实现 SAF。我已经设法使用以下方法将音乐文件复制到外部 SD 卡:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE_OPEN_DIRECTORY);
打开文件/文件夹选择器
复制:
private String copyFile(String inputPath, String inputFile, Uri treeUri) {
InputStream in = null;
OutputStream out = null;
String error = null;
DocumentFile pickedDir = DocumentFile.fromTreeUri(getActivity(), treeUri);
String extension = inputFile.substring(inputFile.lastIndexOf(".")+1,inputFile.length());
try {
DocumentFile newFile = pickedDir.createFile("audio/"+extension, inputFile);
out = getActivity().getContentResolver().openOutputStream(newFile.getUri());
in = new FileInputStream(inputPath + inputFile);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
in.close();
// write the output file (You have now copied the file)
out.flush();
out.close();
} catch (FileNotFoundException fnfe1) {
error = fnfe1.getMessage();
} catch (Exception e) {
error = e.getMessage();
}
return error;
}
但是 当用户选择“移动”时,我想删除可能不在文档树中的原始位置中的文件,因为它们与选择的文件夹无关。它们的路径取自 Mediastore_DATA 字段。 问题是如何获得包含这些文件的 DocumentContract 以便删除它们?
【问题讨论】:
-
为什么需要 DocumentsContract?您可以使用 File 类删除它们,因为您拥有用于 FileInputStream 的完整路径。
-
which brings up the File/folder Picker。不可以。那时您只能选择一个文件夹。一颗树。没有文件。 -
Their paths are taken from the Mediastore_DATA field.。为什么?。您只展示了如何选择目标目录。但是您没有告诉用户如何选择必须复制/移动的音乐文件。我想你也应该这么说。 -
@greenaps,需要一个合同,因为删除可能发生在外部 sdcard 上。我只对选择“复制到文件夹”感兴趣。音乐文件是播放列表中的条目,因此可以存在于内部或外部存储器中。整个想法是将播放列表上的曲目复制或移动到新文件夹中,在移动的情况下,随后删除原件。
-
你还没有回复我的
Why?。或提供解决您的问题所需的更多信息。
标签: android file-permissions storage-access-framework