Разработка web-приложений Tizen

Tizen API для веб-приложений II

Показывать лекцию целиком

Content API содержит следующие компоненты:

  • Content (этот API обеспечивает функциональность для работы с мультимедийным контентом (например, изображениями, видео или музыкой)
  • Download (этот API предоставляет интерфейсы и методы для загрузки удаленных объектов с помощью HTTP запроса)
  • Exif (этот API предоставляет интерфейсы и методы для манипулирования данными Exif из JPEG файла)
  • Content API предоставляет функциональность для поиска контента, содержащего изображения, видео, музыку и др. Имеется возможность искать специфический контент с помощью фильтров. API также поддерживает настройки атрибутов конкретного контента.

    1. Определение типов

    1.1. ContentDirectoryStorageType

    Тип хранилища, в котором размещается контент хранится в перечислении ContentDirectoryStorageType.

    enum ContentDirectoryStorageType { quot;INTERNALquot;, quot;EXTERNALquot; };
    
  • INTERNAL – внутреннее хранилище
  • EXTERNAL –внешнее хранилище
  • 1.2. ContentType

    Тип контента определяется в перечислении ContentType.

    enum ContentType { quot;IMAGEquot;, quot;VIDEOquot;, quot;AUDIOquot;, quot;OTHERquot; };
    
  • IMAGE - изображения
  • VIDEO – видео
  • AUDIO - аудио
  • OTHER – другой контент
  • 1.3. AudioContentLyricsType

    Тип аудиоконтента описывается в перечислении AudioContentLyricsType.

    enum AudioContentLyricsType {quot;SYNCHRONIZEDquot;, quot;UNSYNCHRONIZEDquot;};
    
  • SYNCHRONIZED- синхронизированный
  • UNSYNCHRONIZED - несинхронизированный
  • 1.4. ImageContentOrientation

    Ориентация изображения описывается в перечислении ImageContentOrientation.

    enum ImageContentOrientation {quot;NORMALquot;, quot;FLIP_HORIZONTALquot;, quot;ROTATE_180quot;, quot;FLIP_VERTICALquot;, quot;TRANSPOSEquot;, quot;ROTATE_90quot;, quot;TRANSVERSEquot;, quot;ROTATE_270quot; };
    
  • NORMAL – нормальная ориентация
  • FLIP_HORIZONTAL – отражение по горизонтали
  • ROTATE_180 – поворот на 180 градусов
  • FLIP_VERTICAL – отражение по вертикали
  • TRANSPOSE -перенос
  • ROTATE_90 – поворот на 90 градусов
  • TRANSVERSE - перемещение
  • ROTATE_270 – поворот на 270 градусов
  • 1.5. ContentId

    Идентификатор контента определяется типом ContentId.

    1.6. ContentDirectoryId

    Идентификатор каталога, в котором хранится контент определяется типом ContentDirectoryId.

    1.7. PlaylistId

    Тип плейлиста определяется типом PlaylistId.

    2. Интерфейсы

    2.1. ContentManagerObject

    Определяет тип экземпляра объекта Tizen.

    Объект tizen.content предоставляет доступ к функциональности модуля Content.

    2.2. ContentManager

    Интерфейс ContentManager предоставляет методы для извлечения и манипуляции контентом.

    Методы

    update

    Синхронное обновление атрибутов в базе данных контента

    updateBatch

    Асинхронное обновление пакета атрибутов в базе данных контента

    getDirectories

    Дает список каталогов, в которых содержится контент

    find

    Находит контент, удовлетворяющий условиям, заданным с помощью фильтра.

    Пример 1. Поиск всех песен группы U2, отсортированных по названию

    Этот пример описан на сайте Tizen (https://developer.tizen.org/dev-guide/2.3.0/org.tizen.web.apireference/html/device_api/mobile/tizen/content.html).

    Создадим новый проект Tizen Web Application. Назовем проект content. Вначале нужно добавить привилегии в файл config.xml:

    (рис 18.1)

    Запишем в файл index.html следующий код:

    lt;!DOCTYPE htmlgt;
    lt;htmlgt;
    lt;headgt;
        lt;meta charset=quot;utf-8quot;/gt;
        lt;meta name=quot;viewportquot; content=quot;width=device-width, initial-scale=1.0, maximum-scale=1.0quot;gt;
        lt;meta name=quot;descriptionquot; content=quot;A single-page template generated by Tizen Web IDEquot;/gt;
    
        lt;titlegt;Tizen Web IDE - Tizen - jQuery Mobile - Single-Pagelt;/titlegt;
    
        lt;link rel=quot;stylesheetquot; href=quot;./css/jquery.mobile-1.3.2.cssquot;/gt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/jquery-1.9.1.jsquot;gt;lt;/scriptgt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/jquery.mobile-1.3.2.jsquot;gt;lt;/scriptgt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/main.jsquot;gt;lt;/scriptgt;
        lt;link rel=quot;stylesheetquot; href=quot;./css/style.cssquot; /gt;
        
        lt;script type=quot;text/javascriptquot;gt;
    
     // The following example retrieves all songs from the album quot;The Joshua Treequot;, by artist quot;U2quot;, ordered by the name.
        var count = 100;
        var offset = 0;
        var sortMode = new tizen.SortMode(quot;namequot;, quot;ASCquot;);
        var artistFilter = new tizen.AttributeFilter(quot;artistsquot;, quot;EXACTLYquot;, quot;U2quot;);
        var albumFilter = new tizen.AttributeFilter(quot;albumquot;, quot;EXACTLYquot;, quot;The Joshua Treequot;);
        var filter = new tizen.CompositeFilter(quot;INTERSECTIONquot;, [albumFilter, artistFilter]);
    
        function errorCB(err) {
            console.log( apos;The following error occurred: apos; +  err.name);
        }
    
        function printContent(content, index, contents) {
            console.log(apos;Name: apos; + content.name + apos; Title: apos; + content.title + apos;URL: apos; + content.contentURI + apos;MIME: apos; + content.mimeType);
        }
    
        function findCB(contents) {
            console.log(apos;The Joshua Tree by U2:apos;);
            contents.forEach(printContent);
            // Increase the offset as much as the count and then find content again.
            if (contents.length === count) {
                offset += count;
                tizen.content.find(findCB, errorCB, null, filter, sortMode, count, offset);
            }
        }
    
        tizen.content.find(findCB, errorCB, null, filter, sortMode, count, offset);
    
        lt;/scriptgt;
    lt;/headgt;
    
    lt;bodygt;
        lt;div data-role=quot;pagequot; gt;
            lt;div data-role=quot;headerquot; data-position=quot;fixedquot; data-tap-toggle=quot;falsequot; gt;
                lt;h1gt;Single-page application lt;/h1gt;
            lt;/divgt;lt;!-- /header --gt;
    
            lt;div data-role=quot;contentquot; gt;
                lt;pgt;This is a single page boilerplate template that you can copy to build your first jQuery Mobile page.lt;/pgt;
            lt;/divgt;lt;!-- /content --gt;
    
            lt;div data-role=quot;footerquot; data-position=quot;fixedquot; data-tap-toggle=quot;falsequot; gt;
                lt;h4gt;Footer contentlt;/h4gt;
            lt;/divgt;lt;!-- /footer --gt;
        lt;/divgt;lt;!-- /page --gt;
    lt;/bodygt;
    lt;/htmlgt;
    
    
    (рис 18.2)

    scanFile

    Когда приложение создает или обновляет содержание, этот метод позволяет сканировать его, а затем вставить или обновить содержание в базе данных контента.

    setChangeListener

    Определяет слушатель, получающий уведомления об изменении контента.

    unsetChangeListener

    Сбрасывает слушателя для того, чтобы отписаться от получения уведомлений об изменении контента.

    getPlaylists

    Получает все плейлисты.

    createPlaylist

    Создает новый плейлист

    Пример 2. Создание нового плейлиста

    Создадим новый проект content1, добавим в него те же привилегии, что и в первом примере. В файле index.html добавим следующий скрипт:

    lt;script type=quot;text/javascriptquot;gt;
        var gPlaylists;
        var gPlaylist;
    
        function getPlaylistsFail(err) {
            console.log(quot;getPlaylists failed: quot; + err.message);
        }
    
        function getPlaylistsSuccess(playlists) {
            var cur, i;
            gPlaylists = playlists;
            for(i = 0; i lt; gPlaylists.length; ++i) {
                cur = gPlaylists[i];
                console.log(quot;[quot; + i + quot;] name:quot; + cur.name + quot; num tracks:quot; +
                        cur.numberOfTracks);
            }
        }
    
        function findSuccess(contents) {
            if (contents.length gt; 0) {
                gPlaylist.add(contents[0]);
            }
    
            tizen.content.getPlaylists(getPlaylistsSuccess, getPlaylistsFail);
        }
    
        function findFail(err) {
            console.log(quot;find FAIL: quot; + err.message);
        }
    
        function createSuccess(playlist) {
            console.log(quot;create SUCCESSquot;);
    
            gPlaylist = playlist;
            tizen.content.find(findSuccess, findFail, null,
                    new tizen.AttributeFilter(quot;typequot;, quot;EXACTLYquot;, quot;AUDIOquot;));
        }
    
        function createFail(err) {
            console.log(quot;create FAIL: quot; + err.message);
        }
    
        tizen.content.createPlaylist(quot;My new playlistquot;, createSuccess, createFail);
    
    
        lt;/scriptgt;
    
    (рис 18.3)

    removePlaylist

    Удалят плейлист.

    Пример 3. удаление плейлиста

    Создадим новый проект content2, добавим в него те же привилегии, что и в первом примере. В файле index.html добавим следующий скрипт:

    lt;script type=quot;text/javascriptquot;gt;
        var gPlaylists;
    
        function removePlaylistSuccess() {
            console.log(quot;removePlaylist SUCCESSquot;);
        }
    
        function removePlaylistFail(err) {
            console.log(quot;removePlaylist FAIL: quot; + err);
        }
    
        function getPlaylistsFail(err) {
            console.log(quot;getPlaylists failed: quot; + err);
        }
    
        function getPlaylistsSuccess(playlists) {
            var cur, i;
            gPlaylists = playlists;
            for(i = 0; i lt; gPlaylists.length; ++i) {
                cur = gPlaylists[i];
                console.log(quot;[quot; + i + quot;] name:quot; + cur.name + quot; num tracks:quot; +
                        cur.numberOfTracks);
            }
    
            if(gPlaylists.length lt; 1) {
                console.log(quot;Please add at least 1 playlistquot;);
                return;
            }
    
            console.log(quot;will remove playlist at index [0] name:quot;
                    + gPlaylists[0].name);
    
            tizen.content.removePlaylist(gPlaylists[0].id, removePlaylistSuccess,
                    removePlaylistFail);
        }
    
        tizen.content.getPlaylists(getPlaylistsSuccess, getPlaylistsFail);
    
        lt;/scriptgt;
    
    (рис 18.4)

    Download API

    Этот API предоставляет методы для асинхронной загрузки контента по URL в хранилище.

    1. Определение типов

    1.1. DownloadHTTPHeaderFields

    Набор полей HTTP-заголовков определяется в типе DownloadHTTPHeaderFields

    1.2. DownloadState

    Состояние загрузки определяется в перечислении DownloadState

    enum DownloadState {quot;QUEUEDquot;, quot;DOWNLOADINGquot;, quot;PAUSEDquot;, quot;CANCELEDquot;, quot;COMPLETEDquot;, quot;FAILEDquot;};
    
  • QUEUED - Указывает, что операция загрузки перечислена в очереди.
  • DOWNLOADING - Указывает, что операция загрузки активна
  • PAUSED - Указывает, что операция загрузки находится в состоянии паузы по запросу пользователя.
  • CANCELED - Указывает, что операция загрузки отменяется по запросу пользователя
  • COMPLETED - Указывает, что операция загрузки находится на стадии завершения
  • FAILED - Указывает, что операция загрузки не удалась в силу ряда причин
  • 1.3. DownloadNetworkType

    Тип сети описывается в перечислении DownloadNetworkType.

    enum DownloadNetworkType { quot;CELLULARquot;, quot;WIFIquot;, quot;ALLquot; };
    
  • CELLULAR – Загрузка производится только в сотовой сети
  • WIFI - Загрузка производится только в сети Wi-Fi
  • ALL - Загрузка производится только во всех сетях
  • 2. Интерфейсы

    2.2. DownloadRequest

    Интерфейс DownloadRequest определяет объект запроса загрузки.

    Пример полей заголовков HTTP-запроса.

    var req = new tizen.DownloadRequest(quot;http://download.tizen.org/tools/README.txtquot;);
     req.httpHeader[quot;Pragmaquot;] = quot;no-cachequot;;
     req.httpHeader[quot;Cookiequot;] = quot;version=1; Skin=newquot;;
     req.httpHeader[quot;X-Agentquot;] = quot;Tizen Sample Appquot;;
    

    2.3. DownloadManager

    Интерфейс DownloadManager обрабатывает запросы на загрузку. О каждом шаге операции загрузки можно получить уведомление через обратные вызовы.

    Ниже приводится пример использования DownloadManager.

    lt;script type=quot;text/javascriptquot;gt;
    
     // Check if Download API is supported not on a device.
        var download_api_capability = tizen.systeminfo.getCapability(quot;http://tizen.org/feature/downloadquot;);
        if (download_api_capability === false) {
            console.log(quot;Download API is not supported on this device.quot;);
            //return;
        }
    
        var listener = {
          onprogress: function(id, receivedSize, totalSize) {
            console.log(apos;Received with id: apos; + id + apos;, apos; + receivedSize + apos;/apos; + totalSize);
          },
          onpaused: function(id) {
            console.log(apos;Paused with id: apos; + id);
          },
          oncanceled: function(id) {
            console.log(apos;Canceled with id: apos; + id);
          },
          oncompleted: function(id, fullPath) {
            console.log(apos;Completed with id: apos; + id + apos;, full path: apos; + fullPath);
          },
          onfailed: function(id, error) {
            console.log(apos;Failed with id: apos; + id + apos;, error name: apos; + error.name);
          }
        };
    
        // Starts downloading the file from the Web with the corresponding callbacks.
        var downloadRequest = new tizen.DownloadRequest(quot;http://download.tizen.org/tools/README.txtquot;, quot;documentsquot;);
        var downloadId = tizen.download.start(downloadRequest, listener);
    
        // If you want to download a large file through Wi-Fi,
        var wifi_capability = tizen.systeminfo.getCapability(quot;http://tizen.org/feature/network.wifiquot;);
        var wifiDownloadRequest = new tizen.DownloadRequest(quot;http://download.tizen.org/tools/archive/14.02.2/Ubuntu_12.04/qemu_1.6.0rc3.orig.tar.gzquot;, quot;downloadsquot;, null, quot;WIFIquot;);
    
        if (wifi_capability === true) {
            var downlodId_wifi = tizen.download.start(wifiDownloadRequest, listener);
        } else {
            // If you call tizen.download.start(), NotSupportedError will be thrown.
            console.log(quot;This device doesnapos;t support Download API through Wi-Fi.quot;);
        }
    
        lt;/scriptgt;
    

    Exif API

    Exif API предоставляет интерфейсы и методы для манипулирования данными Exif из файла в формате JPEG. Объект ExifManager предоставляет методы для извлечения объекта ExifInformation из файла JPEG и сохранения данных Exif объекта ExifInformation в файле JPEG. Объект ExifInformation обеспечивает функциональность для получения и установки атрибутов Exif в соответствующий тег Exif.

    1. Определение типов

    1.1. WhiteBalanceMode

    Режим баланса белого изображения описывается в перечислении WhiteBalanceMode.

    enum WhiteBalanceMode { quot;AUTOquot;, quot;MANUALquot; };
    
  • AUTO – режим автоматического баланса белого
  • MANUAL - режим ручного баланса белого
  • 1.2. ExposureProgram

    Программа баланса экспозиции описывается в перечислении ExposureProgram.

    enum ExposureProgram {quot;NOT_DEFINEDquot;, quot;MANUALquot;, quot;NORMALquot;, quot;APERTURE_PRIORITYquot;, quot;SHUTTER_PRIORITYquot;, quot;CREATIVE_PROGRAMquot;, quot;ACTION_PROGRAMquot;, quot;PORTRAIT_MODEquot;, quot;LANDSCAPE_MODEquot;};
    
  • NOT_DEFINED - Информация о программе экспозиции нет или неизвестна
  • MANUAL - В ручном режиме можно независимо устанавливать, как скорость затвора, так и диафрагму вручную (чувствительность ISO также установливается вручную)
  • APERTURE_PRIORITY – он же, режим Av (значение диафрагмы) позволяет ручное управление апертурой, выдержка рассчитывается с помощью камеры для правильной экспозиции (учитывая чувствительность ISO)
  • SHUTTER_PRIORITY – он же S, Tv (значение времени) позволяет ручное управление скоростью затвора и диафрагмы рассчитывается с помощью камеры для правильной экспозиции (учитывая чувствительность ISO)
  • CREATIVE_PROGRAM - камера рассчитывает, как выдержку, так и диафрагму (заданная вручную или автоматически выбранным ISO)
  • ACTION_PROGRAM - Режим активных действий или спорта может увеличить ISO и использовать более высокую скорость затвора, чтобы получить удачный снимок
  • PORTRAIT_MODE - Портретный режим расширяет апертуру, чтобы фон был не в фокусе. Камера может распознать и сфокусироваться на лице человека
  • LANDSCAPE_MODE – Ландшафтный режим позволяет получить высокую глубину резкости
  • 2. Интерфейсы

    2.1. ExifManagerObject

    Объект tizen.exif позволяет получить доступ к данным Exif файла в формате.

    Ниже приводится пример использования объекта tizen.exif.

    lt;script type=quot;text/javascriptquot;gt;
        // Defines success callback
        function onSuccess(exifInfo) {
            console.log(quot;success to get Exif information objectquot;);
        }
    
        // Defines error callback
        function onError(error) {
            console.log(quot;error occurred: quot; + error.name);
        }
    
        function resolveSuccess(file) {
            tizen.exif.getExifInfo(file.toURI(), onSuccess, onError);
        }
    
        function resolveFail(error) {
           console.log(quot;error occurred: quot; + error.name);
        }
        tizen.filesystem.resolve(quot;images/flower.jpgquot;, resolveSuccess, resolveFail);
    
        lt;/scriptgt;
    
    

    Литература

  • https://developer.tizen.org/dev-guide/2.3.0/org.tizen.web.apireference/html/device_api/mobile/tizen/content.html
  • https://developer.tizen.org/dev-guide/2.3.0/org.tizen.web.apireference/html/device_api/mobile/tizen/download.html
  • https://developer.tizen.org/dev-guide/2.3.0/org.tizen.web.apireference/html/device_api/mobile/tizen/exif.html
  • Вернуться к учебному плану