我的应用必须在授予适当权限的情况下将文件从私有应用文件夹复制到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 /副本:content://com.myappname.fileprovider/external_files/Android/data/com.myappname.app/files/subfolder/file.txt
content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FSAFfolder/subfolder
newname.txt
怎么了? 这是标志问题吗?这两个域不兼容吗?
答案 0 :(得分:0)
您正在尝试复制非文档Uri
(contentUri
),并且the JavaDocs for copyDocument()
指出第一个参数必须是文档Uri
:
带有Document#FLAG_SUPPORTS_COPY的文档。此值绝不能为空。
当DocumentsContract
将Uri
称为“文档”时,表示通过Uri
本身获得的DocumentsContract
。其中包括通过Uri
获得的ACTION_OPEN_DOCUMENT
或通过树Uri
获得的DocumentFile
。但是,不涵盖:
Uri
创建的Uri.fromFile()
Uri
的{{1}} FileProvider.getUriForFile()
通过Uri
或Uri.parse()
URL创建的http