我的Android必须将文件从私有应用文件夹复制到SAF位置,该位置之前已被授予权限和授权。 代码是:
static boolean copyDocumentFileToTargetFolderWithNewName(Activity activity, String docUri,String targetFolderUri,String newName)
{
deleteIfExisting(activity,Uri.parse(targetFolderUri),newName);
ContentResolver resolver = activity.getContentResolver();
boolean result=false;
Log.d("copy",docUri+" "+targetFolderUri+" "+newName);
Log.d("doc exists",String.valueOf(fileExists(activity,docUri))); //error here
try {
DocumentsContract.copyDocument(resolver,Uri.parse(docUri),Uri.parse(targetFolderUri));//or error here
DocumentsContract.renameDocument(resolver,Uri.parse(docUri),newName);
result=true;
} catch (FileNotFoundException e) {
result=false;
}
return result;
}
和
static public boolean fileExists(Activity activity,String fileUriString)
{
ContentResolver contentResolver;
contentResolver = activity.getContentResolver();
String parentFolderUriString=StringUtils.fromLastSlashLeft(fileUriString);
String fileName=StringUtils.fromLastSlashRight(fileUriString);
Uri parentFolderUri=Uri.parse(parentFolderUriString);
boolean exists;
DocumentFile docFile=DocumentFile.fromTreeUri(activity,parentFolderUri).findFile(fileName); //error here
exists= (null!=docFile);
return exists;
}
(带有一些不言自明的字符串实用程序调用)
这里是Log.d()行的结果
D/copy: file:///storage/emulated/0/Android/data/com.myappname.app/folder/subfolder/file.txt content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FSAFfolder/newname.txt
我知道
java.lang.IllegalArgumentException: Invalid URI: file:///storage/emulated/0/Android/data/com.myappname.app/folder/subfolder/file.txt
在
DocumentFile docFile=DocumentFile.fromTreeUri(activity,parentFolderUri).findFile(fileName);
第二种方法
或者,当Log.d()被注释时,
java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.ContentProviderClient.call(java.lang.String, java.lang.String, android.os.Bundle)' on a null object reference
在此行:
DocumentsContract.copyDocument(resolver,Uri.parse(docUri),Uri.parse(targetFolderUri));
在第一种方法中。 我的代码有什么问题?私人文件夹uris是否未被授权?如何授权他们?
答案 0 :(得分:0)
我的代码怎么了?
docUri
和parentFolderUri
都不是文档Uri
。它们是您使用Uri
或其他内容创建的Uri.fromFile()
值。您可以知道,因为他们有file
方案。
关于您的当机崩溃,fromTreeUri()
需要文档Uri
。将fromFile()
用作file
Uri
的值。
一旦您超过了该限制,我希望您会在copyDocument()
通话中崩溃。这就是我最初认为的问题所在,直到我重新阅读您的问题。您正在尝试复制非文档Uri
(docUri
),并且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
未授权私人文件夹uris?
这不是“授权”的问题。 https
需要一个文档fromTreeUri()
。 Uri
需要一个文档copyDocument()
。您不能将它们与非文档的Uri
值一起使用。
答案 1 :(得分:0)