Как скопировать из хранилища в FileSystemStorage в Codenameone и отобразить в BrowserComponent - PullRequest
0 голосов
/ 01 ноября 2018

Я читал много постов StackOverflow, в которых обсуждается копирование данных из FileSystemStorage в хранилище в CodenameOne, как описано в этом ответе от Shai, как показано ниже:

InputStream stream =
FileSystemStorage.getInstance().openInputStream(i); 
OutputStream out =
Storage.getInstance().createOutputStream("MyImage"); 
Util.copy(stream, out); 
Util.cleanup(stream); 
Util.cleanup(out);`

Я пытался сделать обратное: сохранить из хранилища в FileSystemStorage, чтобы показать PDF в компоненте Browser (при использовании iOS), но не смог этого сделать. Мне нужно показать PDF в приложении (поэтому я не хочу использовать Display.getInstance().execute()).

По сути, я пытаюсь динамически заполнить Контейнер теми файлами, которые выберет пользователь - я использую библиотеку FileChooser для CN1 от Стива Ханны . (Отказ от ответственности: я внес небольшие изменения в эту библиотеку, так как она использовалась в приложении, над которым я работаю ... ОДНАКО, когда я выбираю изображения с этой библиотекой и перетаскиваю их из хранилища в изображение через InputStream, они отлично отображаются в ImageViewer поэтому я знаю, что все файлы правильно сохраняются в хранилище.)

Вот мой код (с помощью комментария Стива Ханны к GitHub ):

        //fileLocation and fileName are slightly different but both end with file extension
        File file = new File(fileToUpload.getFileName());
        FileSystemStorage fss = FileSystemStorage.getInstance();
        InputStream is = Storage.getInstance().createInputStream(fileToUpload.getLocation());
        OutputStream os = fss.openOutputStream(file.getAbsolutePath());
        Util.copy(is, os);
        ToastBar.Status status = ToastBar.getInstance().createStatus();
        String message = file.exists() + "  " + file.isFile() + file.getAbsolutePath();
        status.setMessage(message);
        status.setExpires(3000);
        status.show();
        NativeLogs.getNativeLogs();
        if (Display.getInstance().getPlatformName().equals("ios")) {
            //Log.p("in ios !!!!");
            BrowserComponent browserComponent = new BrowserComponent();
            browserComponent.setURL(file.getPath());
            horizontalContainer.add(browserComponent);
        }

ToastBar отображает true и true для file.exists() и file.isFile().

Я оговариваю iOS, потому что, насколько я видел при исследовании предварительного просмотра PDF-файлов в приложении , я видел, что Android должен иметь другую реализацию, например, добавление NativeInterface с библиотекой Android. Я также видел в разных ответах в группе Google, что эта функция (с помощью browserComponent для просмотра PDF-файлов) доступна только для iOS, а не на симуляторе. В симуляторе я вижу пустое пространство. Мой iPhone просто зависает и / или вылетает после отображения ToastBar (и я работаю на компьютере с Windows, поэтому не так много возможности видеть собственные журналы ....)

Что я могу сделать, чтобы получить доступ к файлу и показать его в компоненте Browser?

Спасибо!

1 Ответ

0 голосов
/ 01 ноября 2018

Простое решение - файл содержит пробел (например, «Test page.pdf») и не отображается! Когда я использовал файлы без пробелов, это работало, и после удаления пробелов в именах файлов, к счастью, все работало. Мне придется добавить код для обработки этого сценария.

Спасибо за вашу помощь!

...