Cordova media retriever

Plugin repository:

Кордова плагин для выбора и загрузки медиа для гибридных приложений Андроид

Плагин Cordova, реализуюший в гибридном мобильном приложении процедуру выбора фото, видео, аудио или документа с телефона и отправку файлов на сервер.

Apache Cordova - framework для создания мобильных приложений, использующих webview компонент для выполнения javascript-приложения в нативном контейнере, что позволяет использовать тот же код для различных платформ. JS-приложение взаимодействует с ОС устройства посредством плагинов, имеющих две части: javascript и нативную (java, kotlin, c, swift и пр.). Cordova позволяет, посредством механизма плагинов, вызывать нативные функции операционной системы изнутри web-приложения как обычные функции javascript для использования всех возможностей ОС устройства, обычно недоступных web-приложению.

Я заметил, что стандартные плагины cordova обладают на удивление ограниченным, лишь базовым функционалом. Так, плагин для доступа к камере, возвращает лишь uri файла, находящегося во внутреннем хранилище приложения. За один раз одно фото. Как реализовывать требуемый функционал Android приложения при помощи стандартных плагинов, было неясно.

Кроме того, стандартные плагины нередко полагаются на функции api Android, в течение некоторого времени помеченные как deprecated.

Между тем, от плагина, пригодного для практического выбора и загрузки изображений, я ожидал:

  • Возможности выбирать и снимать несколько изображений за один раз.
  • Записи снятого изображения вместе с остальными фотографиями в External storage и в Media store базу соответственно, чтобы оно естественным образом было доступно через альбом.
  • Возврата не только uri этого файла, но одновременно (!) с ним и превью заданных размеров, без создания под него отдельного файла, то есть в виде base-64 строки, чтобы можно было отображать выбранное изображение вместе с прогрессом его загрузки.
  • Одновременно с этим - создания в защищенной памяти отдельного файла заданного разрешения для загрузки файла на сервер именно в данном разрешении, а не исходного файла изображения. И получения его uri соответственно.
  • Извлечения из Media store превью для видео, фото и документов.
  • Извлечения из Media store метаданных, таких, как mime тип, screen name, длительность и размер медиа, автор, название композиции, альбома и так далее. Желательно все эти пункты - за один запрос.
  • Загрузки файлов, в том числе больших, средствами нативной ОС, непосредственно из потока, без копирования в память cordova webview, при этом с использованием jwt аутентификации и держа под контролем другие возможные заголовки и параметры http-запроса.

Почти ничего из этого стандартные плагины кордовы делать не позволяют. Чтобы реализовать всё это, пришлось писать свой плагин, который и предлагаю вниманию всех, кому это может быть интересно.

Плагин написан в основном на java, т.к. многие функции представляют собой глубокую модификацию кода стандартных плагинов. Загрузка файлов осуществляется с использованием библиотеки OKHTTP.

Установка плагина

cordova plugin add https://github.com/valery-designer/cordova-plugin-media-retriever.git

Применение

Выбор файлов системным пикером:

window.retriever.getFiles(successCallback, failureCallback);

Получение информации об аудиофайле:

retriever.getAudioInfo(success, failure, theUri, itemId);

В конце темплейта компонента вашего приложения разместите сам лайтбокс:

<Lightbox lightboxReference = { lightboxReference } />

Учтите, что плагин всё ещё в процессе разработки и реализован только в версии для Android.