SAF-将文件从私有应用文件夹复制到授权的SAF文件夹时,出现NullPointerException

时间:2019-09-28 15:12:00

标签: android nullpointerexception file-copying android-fileprovider storage-access-framework

我的应用必须在授予适当权限的情况下将文件从私有应用文件夹复制到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

怎么了? 这是标志问题吗?这两个域不兼容吗?

1 个答案:

答案 0 :(得分:0)

您正在尝试复制非文档UricontentUri),并且the JavaDocs for copyDocument()指出第一个参数必须是文档Uri

  

带有Document#FLAG_SUPPORTS_COPY的文档。此值绝不能为空。

DocumentsContractUri称为“文档”时,表示通过Uri本身获得的DocumentsContract。其中包括通过Uri获得的ACTION_OPEN_DOCUMENT或通过树Uri获得的DocumentFile。但是,不涵盖

  • Uri创建的Uri.fromFile()
  • 来自Uri的{​​{1}}
  • FileProvider.getUriForFile()通过UriUri.parse() URL创建的http
  • 等等。