Часто при создании мобильных приложений JDE на основе MAF (далее порсто мобильных приложений) возникает необходимость прикреплять к записям таблиц файлы фотографмй. Можно, конечно, создать самому всю клиентскую часть приложения для работы с сервисом медиа-объектов сервера Application Interface Services (AIS). Однако намного быстрее воспользоваться уже существующей компонентой (MAF Feature) и включить ее в свое приложение. Я веду речь о компоненте, входящей в состав некоторых мобильных приложений Oracle, коих уже существует более 90. Данные приложения доступны в виде архива Mobile Application Archive (MAA) и разрешены к использованию в качестве основы для создания собственных мобильных приложений.
Для демонстрации технологии подключения внешней компоненты воспользуемся предоставляемым компанией Oracle демонстрационным проектом мобильного приложения по работе с Адресной книгой (приложение P01012). Распакуем архив JDEMobileSampleApplication.zip, содержащийся в пакете JDE_Mobile_Framework_ххх_24_99.par (раздел "Prerequisites"), в отдельную папку:
Теперь необходимо внести некторые изменения в настройки приложения, а именно, - указать правильные пути к файлам JDEMobileFramework.jar и Login.jar, а так же заменить файл с текстовыми ресурсами jdemfResourceBundle.xlf (если вы сами создали это демо-приложение, а не скачали его в виде архива, то эти шаги вы уже сделали).
И так, в JDeveloper, в панели Projects нажмите правую кнопку мышки на ApplicationController и выберите Project Properties. В окне Project Properties выберите Libraries and Classpath. В панели Classpath Entries выберите JDEMobileFramework.jar и нажмите кнопку Remove:
Найдите файл jdemfResourceBundle.xlf (он поставляется в пакете JDE_Mobile_Framework_ххх_24_99.par (раздел "Prerequisites") и находится по адресу \JDE_Mobile_Framework_XXX_24_99.par\JDEMobileFramework_XXX.zip\JDEMobileFramework_XXX\bundle\) и скопируйте его в папку [Папка нашего проекта AddressBook]\ApplicationController\src\com\oracle\e1\jdemf\bundle\ (если ее не существует, создайте еe)
Проверьте работоспособность приложения, установив его на эмулятор, либо на реальное мобильное устройство (Application -> Deploy)
Мы будем использовать версию архива компоненты (Feature ARchive (FAR)) для планшета, находящуюся в файле MediaObjectsTablet.jar. С версией для смартфонов (MediaObjectsPhones.jar) можно поступить аналогично. Для получения нужного нам архива компоненты скачаем архив МАА приложения Manage Equipment Tablet (M13040) c updatecenter.oracle.com, для этого в поле Type выберем EnterpriseOne Mobile Enterprise Applications, а в поле Search for Name введем Manage_Equipment* и скачаем файл Manage_Equipment_Tablet_MAA_XXX:
Скачанный нами архив приложения может пригодиться еше и как источник текстовых ресурсов на любом из 22 поддерживаемых JDE языков. Для этого необходимо требуемый файл ресурсов jdemfResourceBundle_XX.xlf, находящийся в папке архива Manage_Equipment_Tablet_MAA_XXX_24_99.par\M13040.maa\Projects\ApplicationController\src\com\oracle\e1\jdemf\bundle\, скопировать в папку текстовых ресурсов нашего проекта ([Папка нашего проекта AddressBook]\ApplicationController\src\com\oracle\e1\jdemf\bundle\)
Есть 3 способа подключить архив с компонентой (FAR) к нашему проекту: 1 - как библиотеку, 2 - как проект ViewController и 3 - как внешний JAR. Мы будем работать по 1-му варианту - подключать архив как библиотеку. Прежде всего нам необхоимо зарегистрировать в JDeveloper место хранения архива как IDE Соединение (IDE Connection). Для этого в окне Resources
Мы готовы к использованию новой компоненты.
Для передачи параметров из нашего приложения в компонент используются переменные области видимости "Приложение" (applicationScope):
Имя переменной | Значение |
mediaObjectFormName | Имя формы приложения JDE в формате APPL_VERSION, в котором реализована работа с медиа-объектами (например, "P01012_W01012A") |
mediaObjectStructure | Имя медиа-структуры JDE, с которой будет проходить работа (например, "ABGT") |
mediaObjectKeyValue | Значение ключа, однозначно отпределяющее запись, к которой относятся медиа-объекты. Ключ формируется в формате АА|BB|CC - значения полей структуры mediaObjectStructure, разделенных вертикальными чертами (например, "123|AB|00001") |
booleanMediaObjectReadOnly | Определяет будут ли доступны операции добавления и удаения медиа-объектов (например, "true") |
mediaObjectReturnFeature | Идентификатор компоненты в нашем приложении, в окно которой необходимо вернуться при нажатии кнопки Назад в верхнем левом углу окна компоненты работы с медиа-объектами (например, "ABList") |
mediaObjectTitle | Заголовок окна компоненты (например, "Фотографии") |
public void launchPhotoDlg() {
ResourceBundle bundle = BundleFactory.getBundle("com.oracle.e1.jdemf.bundle.jdemfResourceBundle", Locale.getDefault(), AddressBookDC.class.getClassLoader());
AdfmfJavaUtilities.setELValue("#{applicationScope.mediaObjectFormName}", "P01012_W01012A");
AdfmfJavaUtilities.setELValue("#{applicationScope.mediaObjectStructure}", "ABGT");
P01012_W01012B_GridData gd = p01012_W01012B_FormParent.getFs_P01012_W01012B().getData().getGridData();
AdfmfJavaUtilities.setELValue("#{applicationScope.mediaObjectKeyValue}", gd.getRowset()[gd.getRowIndex()].getMnAddressNumber_19().getValue());
AdfmfJavaUtilities.setELValue("#{applicationScope.booleanMediaObjectReadOnly}", "false");
AdfmfJavaUtilities.setELValue("#{applicationScope.mediaObjectReturnFeature}", "ABList");
AdfmfJavaUtilities.setELValue("#{applicationScope.mediaObjectTitle}", bundle.getString("PHOTOS_1"));
ApplicationGlobals.getInstance().setReturnFeature("ABList");
try {
AdfmfContainerUtilities.resetFeature("com.oracle.e1.jdemf.MediaObjectsTablet.MediaObjectTablet");
} catch (AdfException e) {
throw new AdfException(e.getMessage(), "ERROR");
}
}
Выберите место для кнопки, по нажатию которой будет октрываться экран по работе с медиа-объектами. Мы выбрали место рядом с кнопкой Create Device Contact на экране Detail нашего приложения.
Откройте файл abdetail.amx (ViewController\Web Content\abdetail.amx) и "протяните" мышкой метод launchPhotoDlg(), созданный нами чуть выше, из панели Data Controls в выбранное место файла abdetail.amx, создав тем самым кнопку, вызывающую данный метод:
<amx:facet name="footer">
<amx:panelGroupLayout id="pgl6" layout="horizontal" halign="end">
<!-- Sample code by JDE IDea-->
<amx:commandButton actionListener="#{bindings.launchPhotoDlg.execute}"
text="#{viewcontrollerBundle.PHOTOS_2}"
disabled="#{!bindings.launchPhotoDlg.enabled}" id="cb2"/>
<amx:spacer id="s1" width="8"/>
<!-- End of sample code by JDE IDea-->
<!-- Add Contact To Device-->
<amx:commandButton actionListener="#{bindings.createDeviceContact.execute}" text="Create Device Contact"
disabled="#{!bindings.createDeviceContact.enabled}" id="cb4">
<amx:showPopupBehavior id="spb1" popupId="p1" align="overlapTopCenter" alignId="it2"/>
</amx:commandButton>
</amx:panelGroupLayout>
</amx:facet>
Для возврата из экрана компоненты работы с медиа-объектами в наше приложение необходимо создать функцию JavaScript с именем originalFeatureLaunchFromMediaObjects(). Именно ее будет вызывать компонента при нажатии на кнопку Назад в левом верхнем углу экрана.
Создайте файл JavaScript. Для этого в панели Projects нажмите правую кнопку мышки на папке ViewController\Web Content\js\ и выберите New -> JavaScript File:
originalFeatureLaunchFromMediaObjects = function(featureId){
adf.mf.api.gotoFeature(featureId,
function(req, res) {
//здесь можно вызвать какой-нибудь метод AddressBookDC, используя метод adf.mf.api.invokeMethod
},
function(req, res) {});
};
Теперь необходимо включить созданный файл JavaScript в наше приложение. Для этого в панели Projects откройте файл ViewController\Application Sources\META-INF\maf-feature.xml. В панели Features выберите основной компонент ABList. Ниже откройте закладку Content, в которой выберите Task Flow ABList.1. Ниже в панели Includes нажмите на зеленый "плюс":
Сохраните проект и установите приложение на эмулятор, или на реальное мобильное устройство (Application -> Deploy)
Наслаждайтесь