SAF - NullPointerException при копировании файла из личной папки приложения в авторизованную папку SAF - PullRequest
0 голосов
/ 28 сентября 2019

Мое приложение должно скопировать файл из личной папки приложения в папку 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

content: // com.android.providers.downloads.documents / tree / raw% 3A% 2Fstorage% 2Femulated% 2F0% 2FDownload% 2FSAFпапка / подпапка

newname.txt

Что не так?Это проблема флагов?Два домена не совместимы для копирования?

1 Ответ

0 голосов
/ 28 сентября 2019

Вы пытаетесь скопировать не-документ Uri (contentUri) и JavaDocs для copyDocument() заявляет, что первым параметром должен быть документ Uri:

документ с документом # FLAG_SUPPORTS_COPY Это значение никогда не должно быть нулевым.

Когда DocumentsContract обозначает Uri как «документ», это означает Uriполучено через DocumentsContract сам.Это будет включать Uri, полученный с помощью ACTION_OPEN_DOCUMENT или Uri, полученный с помощью дерева DocumentFile.Однако , который не будет охватывать :

  • A Uri, созданный Uri.fromFile()
  • A Uri из FileProvider.getUriForFile()
  • A Uri, созданный Uri.parse() из http или https URL
  • и т. Д.
...