【发布时间】:2020-01-28 10:14:54
【问题描述】:
我的 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没有授权吗?如何授权?
【问题讨论】:
标签: android directory nullpointerexception file-copying storage-access-framework