Опубликован: 12.12.2015 | Доступ: свободный | Студентов: 665 / 96 | Длительность: 15:42:00
Лекция 18:

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

< Лекция 17 || Лекция 18 || Лекция 19 >
Аннотация: В этом модуле мы познакомимся с API, позволяющими работать с мультимедийным контентом, файловой системой и методами загрузки удаленных файлов по протоколу HTTP.
Ключевые слова: content, API, контент, URL, JPEG, объект, тег

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

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

Content API предоставляет функциональность для поиска контента, содержащего изображения, видео, музыку и др. Имеется возможность искать специфический контент с помощью фильтров. API также поддерживает настройки атрибутов конкретного контента.

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

1.1. ContentDirectoryStorageType

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

enum ContentDirectoryStorageType { &quot;INTERNAL&quot;, &quot;EXTERNAL&quot; };
  • INTERNAL – внутреннее хранилище
  • EXTERNAL –внешнее хранилище

1.2. ContentType

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

enum ContentType { &quot;IMAGE&quot;, &quot;VIDEO&quot;, &quot;AUDIO&quot;, &quot;OTHER&quot; };
  • IMAGE - изображения
  • VIDEO – видео
  • AUDIO - аудио
  • OTHER – другой контент

1.3. AudioContentLyricsType

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

enum AudioContentLyricsType {&quot;SYNCHRONIZED&quot;, &quot;UNSYNCHRONIZED&quot;};
  • SYNCHRONIZED- синхронизированный
  • UNSYNCHRONIZED - несинхронизированный

1.4. ImageContentOrientation

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

enum ImageContentOrientation {&quot;NORMAL&quot;, &quot;FLIP_HORIZONTAL&quot;, &quot;ROTATE_180&quot;, &quot;FLIP_VERTICAL&quot;, &quot;TRANSPOSE&quot;, &quot;ROTATE_90&quot;, &quot;TRANSVERSE&quot;, &quot;ROTATE_270&quot; };
  • 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:

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

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;/&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0&quot;&gt;
    &lt;meta name=&quot;description&quot; content=&quot;A single-page template generated by Tizen Web IDE&quot;/&gt;

    &lt;title&gt;Tizen Web IDE - Tizen - jQuery Mobile - Single-Page&lt;/title&gt;

    &lt;link rel=&quot;stylesheet&quot; href=&quot;./css/jquery.mobile-1.3.2.css&quot;/&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/jquery-1.9.1.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/jquery.mobile-1.3.2.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/main.js&quot;&gt;&lt;/script&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;./css/style.css&quot; /&gt;
    
    &lt;script type=&quot;text/javascript&quot;&gt;

 // The following example retrieves all songs from the album &quot;The Joshua Tree&quot;, by artist &quot;U2&quot;, ordered by the name.
    var count = 100;
    var offset = 0;
    var sortMode = new tizen.SortMode(&quot;name&quot;, &quot;ASC&quot;);
    var artistFilter = new tizen.AttributeFilter(&quot;artists&quot;, &quot;EXACTLY&quot;, &quot;U2&quot;);
    var albumFilter = new tizen.AttributeFilter(&quot;album&quot;, &quot;EXACTLY&quot;, &quot;The Joshua Tree&quot;);
    var filter = new tizen.CompositeFilter(&quot;INTERSECTION&quot;, [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;/script&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div data-role=&quot;page&quot; &gt;
        &lt;div data-role=&quot;header&quot; data-position=&quot;fixed&quot; data-tap-toggle=&quot;false&quot; &gt;
            &lt;h1&gt;Single-page application &lt;/h1&gt;
        &lt;/div&gt;&lt;!-- /header --&gt;

        &lt;div data-role=&quot;content&quot; &gt;
            &lt;p&gt;This is a single page boilerplate template that you can copy to build your first jQuery Mobile page.&lt;/p&gt;
        &lt;/div&gt;&lt;!-- /content --&gt;

        &lt;div data-role=&quot;footer&quot; data-position=&quot;fixed&quot; data-tap-toggle=&quot;false&quot; &gt;
            &lt;h4&gt;Footer content&lt;/h4&gt;
        &lt;/div&gt;&lt;!-- /footer --&gt;
    &lt;/div&gt;&lt;!-- /page --&gt;
&lt;/body&gt;
&lt;/html&gt;


Рис. 18.2.
scanFile

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

setChangeListener

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

unsetChangeListener

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

getPlaylists

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

createPlaylist

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

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

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

&lt;script type=&quot;text/javascript&quot;&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 SUCCESS&quot;);

        gPlaylist = playlist;
        tizen.content.find(findSuccess, findFail, null,
                new tizen.AttributeFilter(&quot;type&quot;, &quot;EXACTLY&quot;, &quot;AUDIO&quot;));
    }

    function createFail(err) {
        console.log(&quot;create FAIL: &quot; + err.message);
    }

    tizen.content.createPlaylist(&quot;My new playlist&quot;, createSuccess, createFail);


    &lt;/script&gt;

Рис. 18.3.
removePlaylist

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

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

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

&lt;script type=&quot;text/javascript&quot;&gt;
    var gPlaylists;

    function removePlaylistSuccess() {
        console.log(&quot;removePlaylist SUCCESS&quot;);
    }

    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 playlist&quot;);
            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;/script&gt;

Рис. 18.4.

Download API

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

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

1.1. DownloadHTTPHeaderFields

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

1.2. DownloadState

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

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

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

enum DownloadNetworkType { &quot;CELLULAR&quot;, &quot;WIFI&quot;, &quot;ALL&quot; };
  • CELLULAR – Загрузка производится только в сотовой сети
  • WIFI - Загрузка производится только в сети Wi-Fi
  • ALL - Загрузка производится только во всех сетях

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

2.2. DownloadRequest

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

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

var req = new tizen.DownloadRequest(&quot;http://download.tizen.org/tools/README.txt&quot;);
 req.httpHeader[&quot;Pragma&quot;] = &quot;no-cache&quot;;
 req.httpHeader[&quot;Cookie&quot;] = &quot;version=1; Skin=new&quot;;
 req.httpHeader[&quot;X-Agent&quot;] = &quot;Tizen Sample App&quot;;
2.3. DownloadManager

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

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

&lt;script type=&quot;text/javascript&quot;&gt;

 // Check if Download API is supported not on a device.
    var download_api_capability = tizen.systeminfo.getCapability(&quot;http://tizen.org/feature/download&quot;);
    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.txt&quot;, &quot;documents&quot;);
    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.wifi&quot;);
    var wifiDownloadRequest = new tizen.DownloadRequest(&quot;http://download.tizen.org/tools/archive/14.02.2/Ubuntu_12.04/qemu_1.6.0rc3.orig.tar.gz&quot;, &quot;downloads&quot;, null, &quot;WIFI&quot;);

    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 doesn&apos;t support Download API through Wi-Fi.&quot;);
    }

    &lt;/script&gt;

Exif API

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

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

1.1. WhiteBalanceMode

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

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

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

enum ExposureProgram {&quot;NOT_DEFINED&quot;, &quot;MANUAL&quot;, &quot;NORMAL&quot;, &quot;APERTURE_PRIORITY&quot;, &quot;SHUTTER_PRIORITY&quot;, &quot;CREATIVE_PROGRAM&quot;, &quot;ACTION_PROGRAM&quot;, &quot;PORTRAIT_MODE&quot;, &quot;LANDSCAPE_MODE&quot;};
  • 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/javascript&quot;&gt;
    // Defines success callback
    function onSuccess(exifInfo) {
        console.log(&quot;success to get Exif information object&quot;);
    }

    // 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.jpg&quot;, resolveSuccess, resolveFail);

    &lt;/script&gt;

Литература

< Лекция 17 || Лекция 18 || Лекция 19 >