SwingFXUtils показывает NoClassFoundError

Я пытался использовать функцию

SwingFXUtils.fromFXImage

который вызывает исключение NoClassFoundError. Как я могу сохранить изображение на мобильном телефоне Gluon?


person tonimaroni    schedule 03.02.2017    source источник
comment
Каков ваш вариант использования? Откуда этот образ?   -  person José Pereda    schedule 04.02.2017
comment
Я использовал сервис изображений. ImageView imageView = новый ImageView(); Services.get(PicturesService.class).ifPresent(service -> { service.takePhoto(false).ifPresent(image -> imageView.setImage(image)); }); Поэтому я пытаюсь использовать fromFXImage из этого изображения.   -  person tonimaroni    schedule 04.02.2017
comment
Хорошо, PicturesService возвращает изображение (либо с камеры, либо из галереи), и вы хотите сохранить его в личном или общедоступном хранилище?   -  person José Pereda    schedule 04.02.2017
comment
Да, правильно.   -  person tonimaroni    schedule 04.02.2017


Ответы (1)


SwingFXUtils и никакие классы, связанные с Swing, не поддерживаются на Android.

Судя по вашим комментариям, вы используете Charm Down PicturesService для получения изображения с камеры и отображения его на элементе управления ImageView:

Services.get(PicturesService.class).ifPresent(service -> 
    service.takePhoto(false).ifPresent(imageView::setImage));

И теперь вы хотите сохранить это изображение в личном/общедоступном хранилище на вашем устройстве.

Если вы проверите API для takePhoto у него есть аргумент savePhoto, который вы можете использовать для сохранения изображения:

// take photo and save picture
Services.get(PicturesService.class).ifPresent(service -> 
    service.takePhoto(true).ifPresent(imageView::setImage));

Теперь, если у вас есть посмотрите как это реализовано, вы найдете свою картинку под внешний накопитель для картинок:

File photo = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "IMG_"+ timeStamp + ".jpg");

Вы можете легко получить доступ к этой папке под /sdcard/Pictures.

Также вы можете использовать StorageService и getPublicStorage("Pictures"), и, просматривая каталог, вы можете получить последний добавленный файл:

File picturesDir = Services.get(StorageService.class)
            .flatMap(s -> s.getPublicStorage("Pictures"))
            .orElseThrow(() -> new RuntimeException("Error retrieving public storage")); 
for (File pic : picturesDir.listFiles()) {
        System.out.println("file " + pic.getName());
}
person José Pereda    schedule 03.02.2017
comment
Отлично... Спасибо, что выручили меня еще раз!! - person tonimaroni; 04.02.2017
comment
Я хотел бы добавить один вопрос... вы можете сохранить фотографии, сказав takePhoto (true). Действительно большая проблема... как называется файл сохраненного изображения. В папке могут быть десятки других. В Android имя файла содержит отметку времени, но, поскольку я не знаю точную отметку времени, когда было сделано изображение, я могу только проверить все существующие изображения в папке и попытаться выяснить изображение, которое ближе всего к LocalDateTime.now ()? Пожалуйста, не говорите мне, что это то, что я должен сделать. - person magicroomy; 14.03.2017
comment
Вы можете просто отсортировать файлы по последней модификации и получить первую/последнюю? Я не думаю, что это так уж плохо? - person José Pereda; 14.03.2017
comment
Ну, я бы не хотел отвечать на эту процедуру. Кто сказал, что нет службы или чего-то еще, работающего параллельно и одновременно создающего файлы в этой папке (многопоточные)? Что, если это произойдет между тем, как я сделаю снимок, а затем попытаюсь найти самый последний файл? Я бы ошибся. Может быть, не слишком вероятно, но возможно. - person magicroomy; 15.03.2017
comment
Основной целью текущего API PicturesService является извлечение изображения (JavaFX), и, при желании, вы можете сохранить файл. Если у вас есть другие потребности, вы можете расширить его и внести свой вклад в открытый исходный код project< /а>. - person José Pereda; 15.03.2017
comment
В этом случае мне может понадобиться какой-то толчок к тому, как его скомпилировать после клонирования. Есть ли документ, как его скомпилировать? gradlew distZip выдает ошибки компиляции в Android, хотя я установил ANDROID_HOME в свой каталог sdk в gradle.properties. А я даже до родного IOS не добрался. - person magicroomy; 16.03.2017
comment
Обычно я делаю ./gradlew clean install в корневом проекте Charm Down, чтобы установить его в свой локальный репозиторий. Для тестирования вы можете использовать mavenLocal() в репозиториях и использовать версию моментального снимка для плагинов: downConfig { version 3.3.0-SNAPSHOT ... }. Это должно работать на всех платформах - person José Pereda; 17.03.2017
comment
Но если у вас есть какие-либо вопросы, задайте новый, чтобы мы не просматривали комментарии. - person José Pereda; 17.03.2017