{{indexmenu_n>1}} =====Tipos de Cámaras by XOne===== \\ XOne entre sus bondades, ha implementado un módulo de cámara, brindando excelentes potencialidades para esta función y para poder habilitarlas se puede hacer a través de varios alternativas que detallamos a continuación: \\ ^ Modos para implementar cámara en las App XOne ^ | [[wiki:2.-desarrollo-app:2.5.-controles-by-xone:camara:start#Prop Type="IMG" + ui.startCamera|Prop Type="IMG" + ui.startCamera]] | | [[wiki:2.-desarrollo-app:2.5.-controles-by-xone:camara:start#Prop Type="IMG" + ui.startCamera con JSON|Prop Type="IMG" + ui.startCamera con JSON]] | | [[wiki:2.-desarrollo-app:2.5.-controles-by-xone:camara:start#Prop Type VD|Prop Type VD]] | | [[wiki:2.-desarrollo-app:2.5.-controles-by-xone:camara:start#Prop Type PH|Prop Type PH]] | | [[wiki:2.-desarrollo-app:2.5.-controles-by-xone:camara:start#Prop Type PH con atributo|Prop Type PH con atributo]] | \\ ====Prop Type="IMG" + ui.startCamera==== \\ En este caso se define un prop type IMG, mediante el cual se accede a la cámara del dispositivo y esta queda embebida en la propia ventana desde la que es invocada . \\ **Ejemplo:** ==== Prop Type="IMG" + ui.startCamera con JSON ==== \\ En este caso se define un prop type IMG igual que el ejemplo anterior y lo que cambia es que la llamada a la cámara se hace a través del método ui y un JSON como parámetro. \\ **Ejemplo:** function doStartCameraReservaIMG(evento,obj,propbt,propfoto) { let sDeviceOS = appData.getGlobalMacro("##DEVICE_OS##"); let jsParams; let ventana; if (sDeviceOS == "android") { jsParams = { width : 800, height : 600, onSuccess : function(sNuevaFoto) { obj[propfoto] = sNuevaFoto; ventana = ui.getView(obj); if (ventana) { //ventana.refresh(propbt); ventana.refresh(); } }, onCancelled: function() { //Nada } }; } else { jsParams = { width : 800, height : 600, quality : 0.6, onSuccess : function(sNuevaFoto) { obj[propfoto] = sNuevaFoto; ventana = ui.getView(obj); if (ventana) { //ventana.refresh(propbt); ventana.refresh(); } }, onCancelled: function() { //Nada } }; } ui.startCamera(jsParams); } \\ **Cámara con CallBacks** \\ /* * Type (opcional), photo/video. Por defecto photo * Width (opcional) * Height (opcional) * UseInternalCamera (opcional), indica si usar la app de fotos del dispositivo * o la implementación interna de XOne. Por defecto false */ function startPhotoCameraWithCallbacks() { let jsParams = { type : "photo", width : 800, height : 600, useInternalCamera: false, onSuccess : function(sPhoto) { ui.showToast("Todo OK. Foto: " + sPhoto); }, onCancelled : function() { ui.showToast("Se ha cancelado la captura de foto."); } }; ui.startCamera(jsParams); } ====Prop Type VD==== Esta es la propia cámara XOne, se define a través de un Prop Type VD. Para este tipo de prop pueden definirse 3 tipos de cámaras al usarse el atributo camera-api="V1|v2|camerax" . Las funciones que brinda este control Cámara se obtienen haciendo:\\ \\ let control = getControl("MAP_CAMERA"), donde "MAP_CAMERA" es la propiedad de la cámara.\\ \\ __Estas funciones son:__ ^ Funciones ^ Descripción ^ | control.takePicture(params) | para hacer foto | | control.record | para grabar vídeo | | control.stopRecording | para detener la grabación | | control.setFlashMode(sFlashMode) | para decirle si el flash está activo, desactivado, automático, etc. | | control.setCamera("front") | para escoger entre la cámara trasera y la frontal. | | control.startPreview | para iniciar la visualización de la cámara en tiempo real. | | control.stopPreview | para tener la visualización de la cámara en tiempo real. | | control.isCameraOpened | para saber si la visualización está activada (devuelve true p false) | | control.setAutoFocus | para decir si quieres que se active el auto enfoque o no. | | control.isAutoFocus | true o false, para saber si está activado el auto enfoque. | | control.getSupportedAspectRatios | devuelve un arreglo con las relaciones de aspecto permitidas por la cámara. | | control.getSupportedVideoProfiles | devuelve un arreglo con los perfiles de vídeo permitidos por la cámara. | | control.getMaxZoom | devuelve el max Zoom permisible por la cámara. | | control.setZoom(nZoom), | pone el zoom según el parámetro. (Son números que van desde 1 hasta el mayor valor permitido por la cámara). | | control.setOnCodeScanned, | es para escanear (En este caso tiene un parámetro que es una función de callback, para lo que se quiera hacer con el código escaneado). | \\ Ejemplo: \\ function takePicture() { let control = getControl("MAP_CAMERA"); if (!control) { return; } var params = { filename : "test.jpg", saveToGallery: true, width : 360, height : 360, onFinished : function(sFileName) { if (!sFileName) { ui.showToast("Error de cámara"); } else { ui.showToast("Abriendo nueva foto..."); ui.openFile(sFileName); } } }; control.takePicture(params); } function record() { let control = getControl("MAP_CAMERA"); if (!control) { return; } var currentObj = self; let params = { quality : self.MAP_CAMERA_QUALITY, maxDuration : 10000, // Milisegundos //maxFileSize : 10485760, // Bytes withMicAudio: true, onFinished : function(sFileName) { self.MAP_RECORDING=0; ui.refresh("MAP_START_RECORDING,MAP_STOP_RECORDING,MAP_START_PREVIEW,MAP_STOP_PREVIEW"); if (!sFileName) { ui.showToast("Error de cámara"); } else { ui.showToast("Nuevo vídeo..."); ui.openFile(sFileName); } } }; control.record(params); self.MAP_RECORDING=1; ui.refresh("MAP_START_RECORDING,MAP_STOP_RECORDING,MAP_START_PREVIEW,MAP_STOP_PREVIEW"); } function stopRecording() { let control = getControl("MAP_CAMERA"); if (!control) { return; } control.stopRecording(); } function startPreview() { let control = getControl("MAP_CAMERA"); if (!control) { return; } control.startPreview(); } function stopPreview() { let control = getControl("MAP_CAMERA"); if (!control) { return; } control.stopPreview(); } function isOpened() { let control = getControl("MAP_CAMERA"); if (!control) { return; } let bOpened = control.isCameraOpened(); ui.showToast("Abierta: " + bOpened); } function isAutoFocus() { let control = getControl("MAP_CAMERA"); if (!control) { return; } let bAutoFocus = control.isAutoFocus(); ui.showToast("Autofoco: " + bAutoFocus); } function getSupportedAspectRatios() { let control = getControl("MAP_CAMERA"); if (!control) { return; } let allAspectRatios = control.getSupportedAspectRatios(); let sMessage = "Relaciones de aspecto soportadas: "; for (let i = 0;i < allAspectRatios.length;i++) { sMessage = sMessage + "\n" + allAspectRatios[i]; } ui.msgBox(sMessage, "Mensaje", 0); } function doSetOnCodeScanned() { let control = getControl("MAP_CAMERA"); if (!control) { return; } control.setOnCodeScanned(function(evento) { let nResult = ui.msgBox("Valor: " + evento.data + "\nTipo: " + evento.type, "¿Código OK?", 4); if (nResult == 6) { return true; } else { return false; } }); } /** * Modifica el comportamiento de flash de la cámara. * * Valores posibles: * 1) on: Siempre encendido al tomar una foto * 2) off: Siempre apagado al tomar una foto * 3) torch: Siempre encendido * 4) auto: Encendido o apagado al tomar una foto dependiendo de lo que diga el * sensor de luz * 5) red_eye: Encendido o apagado al tomar una foto dependiendo de lo que diga * el sensor de luz, en un modo especial que reduce los ojos rojos */ function doSetFlashMode(sFlashMode) { let control = getControl("MAP_CAMERA"); if (!control) { return; } control.setFlashMode(sFlashMode); } function doToggleFlashMode() { let control = getControl("MAP_CAMERA"); if (!control) { return; } let sFlashMode = control.getFlashMode(); if (sFlashMode == "on") { control.setFlashMode("off"); self.setFieldPropertyValue("MAP_TOGGLE_FLASH_MODE", "img", "flash-off.png"); } else if (sFlashMode == "off") { control.setFlashMode("auto"); self.setFieldPropertyValue("MAP_TOGGLE_FLASH_MODE", "img", "flash-auto.png"); } else if (sFlashMode == "auto") { control.setFlashMode("torch"); self.setFieldPropertyValue("MAP_TOGGLE_FLASH_MODE", "img", "flash-torch.png"); } else if (sFlashMode == "torch") { control.setFlashMode("on"); self.setFieldPropertyValue("MAP_TOGGLE_FLASH_MODE", "img", "flash-on.png"); } ui.refresh("MAP_TOGGLE_FLASH_MODE"); } function doToggleCamera() { let control = getControl("MAP_CAMERA"); if (!control) { return; } let sCamera = control.getCamera(); if (sCamera == "front") { control.setCamera("back"); } else if (sCamera == "back") { control.setCamera("front"); } } function doToggleAutoFocus() { let control = getControl("MAP_CAMERA"); if (!control) { return; } control.setAutoFocus(!control.isAutoFocus()); } function getControl(sPropName) { let window = ui.getView(self); if (!window) { return null; } let control = window[sPropName]; if (!control) { return null; } return control; } ==== Prop Type PH ==== \\ En este caso se habilita un control cámara definiendo a través de un prop type PH, tiene como atributos las imágenes asociadas para lanzar la cámara. Se lanza por defecto la cámara del Sistema Operativo del dispositivo. \\ **Ejemplo:** \\ ==== Prop Type PH con atributo ==== \\ En este caso es similar al anterior, pero si se define el atributo **use-internal-camera="true"** que permite lanzar la cámara interna del framework. Esta opción es recomendable para usar en dispositivos de bajas prestaciones donde el sistema operativo pudiera cerrar aplicaciones en segundo plano. \\ **Ejemplo:**