Я не знаю, если это только обходной путь, но если я заменю
String docId = DocumentsContract.getTreeDocumentId(uri);
на
String docId = DocumentsContract.getDocumentId(uri);
, метод работает.
public static boolean copyFileToTargetSAFFolder(Context context, String filePath, String targetFolder, String destFileName )
{
Uri uri = Uri.parse(targetFolder);
String docId = DocumentsContract.getDocumentId(uri);
Uri dirUri = DocumentsContract.buildDocumentUriUsingTree(uri, docId );
Uri destUri = null;
try
{
destUri = DocumentsContract.createDocument(context.getContentResolver(), dirUri, "*/*", destFileName);
} catch (FileNotFoundException e )
{
e.printStackTrace();
return false;
}
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(filePath);
os = context.getContentResolver().openOutputStream( destUri, "w");
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0)
os.write(buffer, 0, length);
is.close();
os.flush();
os.close();
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
Действительнотеперь в журнале
dirUri content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Ffoldername/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Ffoldername%2Fsubfoldername
файл правильно скопирован в эту папку.