четверг, 9 апреля 2015 г.

Взаимодействие с уcтройствами в Oracle MAF

Если вы прочитали предыдущую статью (Создание простого MAF ( ADF Mobile) приложения в JDeveloper 12c), то  уже научились создавать простые мобильные приложения.  Теперь давайте изучим  как  в Oracle MAF происходит взаимодействие с устройствами смартфона. 

Существует три способа взаимодействия со службами устройств:

  • Через декларативный Data Control
  • Через  MAF Java API
  • Через JavaScript API
Рассмотрим работу этих механизмов.

Декларативный Data Control 

Любое MAF приложение имеет data control с именем  DeviceFeatures.  При помощи этого data control-а можно очень легко создать формы для взаимодействия с устройствами смартфона



В таблице ниже я опишу эти методы :


Название метода Описание Входящие данные Возвращаемые данные
createContact Создается контакт в записной книжке смартфона Contact aContact Contact contact -  созданный контакт
displayFile Отображает  файл с телефона.
В зависимости от платформы, приложения пользователя могут просматривать PDF-файлы, файлы изображений, документы Microsoft Office, а также различные другие типы файлов.
String fileURL
String HeaderText
-
findContacts Происходит поиск контактов в записной книжке смартфона String contactFields
String  filter
boolean multiple
Contact aContact
removeContact  Удаляется контакт в записной книжке Contact aContact -
updateContact Обновляется контакт в записной книжке Contact aContact Contact aContact
sendEmail Отправка e-mail String to
String cc
String subject
String body
String bcc
String attachments
String mimeTypes
-
sendSMS Отправка SMS String to
String body
-
startLocationMonitor Метод для получения регулярных обновлений  позиции устройства boolean enableHighAccuracy
int updateInterval
String locationListener
-
getPicture Сделать снимок  при помощи камеры int quality
int destinationType
int sourceType
boolean allowEdit
int encodingType
int targetWidth
int targetHeight


String result

Вид при переносе на страницу и описание входящих и исходящих данных:
1. createContact
После нажатия  на createContact, будут создана запись с данными из aContact в контактах вашего смартфона. 
Составной Тип Contact имеет следующие поля:
String displayName - имя
String familyName - фамилия
String nickname - ник
ContactField[] phoneNumbers - телефонные номера 
ContactField[] emails - электронные почты
ContactAddresses[] addresses- адреса  
ContactField[] ims - ims
ContactOrganization[] organizations - организации 
Date birthday - день рожденья 
String note - примечание
ContactField[] photos - фотографии
ContactField[] categories - категории
ContactField[] urls - url адреса

Пример заполнения данными:

         String givenName = "Mikhail";
        String familyName = "Peraviortkin";
        String note = "Note.....";
        String phoneNumberType = "mobile";
        String phoneNumberValue = "375-297-1234";
        String emailType = "home";
        String emailValue = "perevertkinma@gmail.com";
        String addressType = "home";
        String addressStreet = "Suvorova";
        String addressLocality = "Brest";
        String addressCountry = "Belarus";
        String addressPostalCode = "224022";
        ContactField[] phoneNumbers = null;
        ContactField[] emails = null;
        ContactAddresses[] addresses = null;
            
  
        Contact aContact = new Contact();
             
        ContactName name = new ContactName();
        name.setFamilyName(familyName);
        name.setGivenName(givenName);
        aContact.setName(name);
             
        ContactField phoneNumber = new ContactField();
        phoneNumber.setType(phoneNumberType);
        phoneNumber.setValue(phoneNumberValue);
             
        phoneNumbers = new ContactField[] { phoneNumber };
             
        ContactField email = new ContactField();
        email.setType(emailType);
        email.setValue(emailValue);
             
        emails = new ContactField[] { email };
             
        ContactAddresses address = new ContactAddresses();
        address.setType(addressType);
        address.setStreetAddress(addressStreet);
        address.setLocality(addressLocality);
        address.setCountry(addressCountry);
             
        addresses = new ContactAddresses[] { address };
             
        aContact.setNote(note);
        aContact.setPhoneNumbers(phoneNumbers);
        aContact.setEmails(emails);
        aContact.setAddresses(addresses);

2. displayFile
fileURL - абсолютный адрес к файлу
headerText  -  текст отображаемый в заголовке файла (только для  iOS)


3.findContacts

Для поиска контактов используется три переменных

contactFields  - в эту переменную вводятся через запятые список полей, где будет происходить поиск.Например : "emails,phoneNumbers"
filter  -  сам критерий поиска. Например "Misha"
multiple -  устанавливается "true", если хотите, что бы вывелись все результаты поиска, и "false" если необходим только первый результат поиска( по умолчанию  false)

4 - 5.У removeContact и updateContact так же как и createContact создается только кнопка, выполняющую необходимую операцию.


6. sendEmail

to - список получателей (через запятую)
cc - список получателей копии письма (через запятую)
subject -  тема письма
body - текст письма
bcc  - список получателей скрытой копии (через запятую)
attachments - список прикрепленных файлов  (через запятую). Должны быть указаны абсолютные имена файлов, что бы узнать их используйте AdfmfJavaUtilities.getDirectoryPathRoot ().
mimeTypes -  список MIME типов прикрепленных файлов ,  указанных в том же порядке что и файлы. Пропишите  null, что бы система автоматически определила типы 


7. sendSMS
to - список получателей (через запятую)
body -  текст сообщения


8.startLocationMonitor 


enableHighAccuracy включить высокую точность результатов
updateInterval - устанавливается интервал между получениями координат (в миллисекундах).
locationListener - метод в бине, который будет вызываться при получении координат
9.getPicture 


quality - Качество сохраняемого изображения. Диапазон  [0, 100]
destinationType -  Выбрать формат возвращаемого значения. 
            0 = DESTINATIONTYPE_DATA_URL = Возвращает изображение как base64 строку 
            1 = DESTINATIONTYPE_FILE_URI = Возвращает изображение как имя файла URI, например  "file:///absolute/path/to/kartinka.jpeg".  Для более экономичного использования ресурсов, рекомендуется использовать DESTINATIONTYPE_FILE_URI 
sourceType - - Откуда берется изображения? 
            0 = SOURCETYPE_PHOTOLIBRARY = с фото библиотеки устройства
            1 = SOURCETYPE_CAMERA = сделать фото с камеры устройства
            2 = SOURCETYPE_SAVEDPHOTOALBUM = из альбома сохраненных фотографий устройства
allowEdit - Разрешение простого редактирования изображения перед выбором
encodingType - Выбор кодировки возвращаемого изображения
           0 = ENCODING_TYPE_JPEG = JPEG 
           1 = ENCODING_TYPE_PNG = PNG 
targetWidth -  Ширина в пикселях для масштабирования изображения. Необходимо использовать с targetHeight. Соотношение сторон сохраняется
targetHeight -  Высота в пикселях для масштабирования изображения. Необходимо использовать с targetWidth. Соотношение сторон сохраняется


MAF Java API

Автоматически созданные формы  и кнопки конечно милые, но они вряд ли подойдут для вашего будущего приложения.  Если вы хотите более глубокое взаимодействие с устройствами, вам необходимо использовать Java API. При помощи Java API вы можете напрямую получить доступ к устройствам  из ваших bean-ов и вызывать в любой момент. В  MAF Java APIs для этого используется DeviceManager, он дает дает доступ к функциям устройства. Для начала работы с DeviceManager нужно  выполнить следующий код :

DeviceManager dm=DeviceManagerFactory.getDeviceManager();

Далее нужно  вызвать необходимый метод, например для отправки SMS нужно выполнить следующий метод:

dm.sendSMS("+375297939111", "Смска");

Весь список методов описан в  в Oracle Fusion Middleware Java API Reference for Oracle Mobile Application Framework


JavaScript API

В MAF так же существует возможность работы с устройствами через JavaScript.
в скрипте просто нужно вызвать необходимый метод, например:

adf.mf.api.sendSMS({to: "375297939111",
                        body: "Смска"},
                       success, failed);


Весь список методов описан в  Oracle® Fusion Middleware JSDoc Reference for Oracle Mobile Application Framework



Объект DeviceScope 

MAF  также поддерживает возможность получать характеристики устройства в режиме реального времени на странице. Для этого используется объект DeviceScope . Это может  пригодиться допустим для того, что бы отображать кнопку "сделать фото", если в устройстве присутствует камера. На странице это будет выглядеть так

 <amx:commandButton actionListener="#{bindings.getPicture.execute}" text="сделать фото"
                       rendered="#{deviceScope.hardware.hasCamera}"
                       disabled="#{!bindings.getPicture.enabled}" id="cb3"/>



Свойство
Описание 
EL Expression
device.name
Возвращает название устройства
 #{deviceScope.device.name}
device.platform
Возвращает платформу устройства. Например : "iPhone"
 #{deviceScope.device.platform}
device.version
Возвращает версию платформы.Например :
""5.0.2""
 #{deviceScope.device.version}
device.os
Возвращает название ОС
 #{deviceScope.device.os}
device.model
Возвращает модель. Например : "i386"
 #{deviceScope.device.model}
device.phonegap
Возвращает версию phonegap
 #{deviceScope.device.phonegap}
hardware.hasCamera
возвращает true при наличии камеры
 #{deviceScope.hardware.hasCamera}
hardware.hasContacts
возвращает true при наличии контактов
 #{deviceScope.hardware.hasContacts}
hardware.hasTouchScreen
возвращает true при наличии TouchScreen 
 #{deviceScope.hardware.hasTouchScreen}
hardware.hasGeolocation
возвращает true при наличии gps
 #{deviceScope.hardware.hasGeolocation}
hardware.hasAccelerometer
возвращает true  при наличии акселерометра
 #{deviceScope.hardware.hasAccelerometer}
hardware.hasCompass
возвращает true при наличии компаса
 #{deviceScope.hardware.hasCompass}
hardware.hasFileAccess
возвращает true при наличии доступа к файлам
#{deviceScope.hardware.hasFileAccess}
hardware.hasLocalStorage
возвращает true при наличии локальный устройств для хранения данных
#{deviceScope.hardware.hasLocalStorage}
hardware.hasMediaPlayer
возвращает true при наличии медиа проигрывателя 
#{deviceScope.hardware.hasMediaPlayer}
hardware.hasMediaRecorder
возвращает true при возможности записи медиа
#{deviceScope.hardware.hasMediaRecorder}
hardware.networkStatus
Возвращает статус сети:
"wifi", "2g", "unknown", "none"
#{deviceScope.hardware.networkStatus}
hardware.screen.width
Возвращает ширину экрана
#{deviceScope.hardware.screen.width}
hardware.screen.height
Возвращает высоту экрана
#{deviceScope.hardware.screen.height}
hardware.availableWidth
Возвращает допустимую ширину
#{deviceScope.hardware.screen.availableWidth}
hardware.availableHeight
Возвращает допустимую 
высоту
#{deviceScope.hardware.screen.availableHeight}
hardware.screen.dpi
Возвращает  dpi
#{deviceScope.hardware.screen.dpi}
hardware.screen.diagonalSize
 Возвращает размер диагонали у экрана
#{deviceScope.hardware.screen.diagonalSize}
hardware.screen.scaleFactor
возвращает ScaleFactor 
#{deviceScope.hardware.screen.scaleFactor}