我的应用程序必须在授予适当权限的情况下将文件从私有应用程序文件夹复制到SAF文件夹。
使用的代码是:
static boolean copyFileToTargetFolderWithNewName(Activity activity, String docUri,String targetFolderUri,String newName)
{
deleteIfExisting(activity,Uri.parse(targetFolderUri),newName);
File newFile = new File(docUri);
Uri contentUri = FileProvider.getUriForFile(activity, "com.myappname.fileprovider", newFile);
ContentResolver resolver = activity.getContentResolver();
boolean result=false;
Log.d("copy",contentUri+" "+targetFolderUri+" "+newName);
try {
//error here
Uri newUri=DocumentsContract.copyDocument(resolver,contentUri,Uri.parse(targetFolderUri));
DocumentsContract.renameDocument(resolver,newUri,newName);
result=true;
} catch (FileNotFoundException e) {
result=false;
}
return result;
}
日志输出将产生:
D / copy:content://com.myappname.fileprovider/external_files/Android/data/com.myappname.app/files/subfolder/file.txt
内容://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FSAFfolder/subfolder
newname.txt
怎么了?这是标志问题吗?这两个域不兼容复制吗?
您正在尝试复制非文档Uri
(contentUri
),并且the JavaDocs for copyDocument()
声明第一个参数必须为文档copyDocument()
:
带有Document#FLAG_SUPPORTS_COPY的文档,此值不得为null。
[Uri
将DocumentsContract
称为“文档”时,表示通过Uri
本身获得的Uri
。这将包括通过DocumentsContract
获得的Uri
或通过树ACTION_OPEN_DOCUMENT
获得的Uri
。但是,不会覆盖:
DocumentFile
创建的Uri
Uri.fromFile()
中的Uri
FileProvider.getUriForFile()
从Uri
或Uri.parse()
URL创建的http