Android Storage Access Framework - ParcelFileDescriptor - создает файл 0B при записи файла - PullRequest
0 голосов
/ 18 апреля 2020

Stackoverflow

И большое спасибо за чтение этого вопроса.

В настоящее время я пытаюсь получить определенный каталог целиком с моего Linux сервера на

My android телефон через sftp.

Пока мой код работал нормально.

Однако, как только я собрал свое приложение в виде Signed APK и установил его, приведенный ниже код не работает должным образом.

Он не загружает файл с моего Linux сервера, но создает файлы размером 0B.

private void recursiveFolderDownload(String src, DocumentFile pickedDir) throws SftpException, InterruptedException {
    Vector<ChannelSftp.LsEntry> fileAndFolderList = channelSftp.ls(src);
    for (ChannelSftp.LsEntry item : fileAndFolderList) {
        if (!item.getAttrs().isDir()) {
            DocumentFile newFile = pickedDir.findFile(item.getFilename());
            if(newFile==null){
                MainActivity.changeLoadingMessage("Fetching "+item.getFilename());
                restoreStatus = "Fetching "+item.getFilename();
                newFile = pickedDir.createFile("",item.getFilename());
                restoringFiles.add(getPathFromUri(newFile.getUri()));
                write(src + "/" + item.getFilename(),newFile.getUri());
            }
            else{
                MainActivity.changeLoadingMessage("Skipping "+item.getFilename());
                restoreStatus = "Skipping "+item.getFilename();
            }
        } else if (!(".".equals(item.getFilename()) || "..".equals(item.getFilename()))) {
            DocumentFile newDir = pickedDir.findFile(item.getFilename());
            if(newDir==null){
                newDir = pickedDir.createDirectory(item.getFilename());
            }
            recursiveFolderDownload(src + "/" + item.getFilename(), newDir);
        }
    }
}

private void write(String src, Uri uri) throws InterruptedException {
    try {
        ParcelFileDescriptor descriptor = context.getContentResolver().openFileDescriptor(uri,"w");
        if(descriptor!=null) {
            FileOutputStream fos=new FileOutputStream(descriptor.getFileDescriptor());
            channelSftp.get(src,fos);
            fos.close();
        }
    } catch (IOException | SftpException e) {
            e.printStackTrace();
    }
}

Конечно, я реализовал Storage Access Framework, используя действия с Intent.ACTION_OPEN_DOCUMENT_TREE

Странно, что этот код работает как не выпущенный APK, но не как релизный APK.

В любом случае. Большое спасибо за чтение этого вопроса.

Надеюсь, я смог найти ответ.

...