1.목적

FUSE 를 이용하여 Native Camera에 접근하여 사진을 찍고, 보여주고, 저장하는 앱을 만든다.


2. 알아야 할 것

현재 FUSE 는 배타 환경으로 오픈하였기 때문에 NATIVE API가 빈약한 상태이다.

구현에 들어가기 전 FUSE 에서 제공하는 API의 스펙을 확인하는 것을 추천한다.


사용하려고 했던 API스펙


(1) Camera - https://www.fusetools.com/learn/fusejs#camera


Native Camera를 호출할 수 있는 API 다.

제공하는 함수는 takePicture 가 유일한데, 전달 값으로 너비와 높이, 방향이 있다.

그러나 직접 구현해본 결과 전달 값과 상관없이 기본 카메라의 앵글로 촬영되었으며,

이미지 생성도 기본 카메라와 동일한 크기로 작동하였다.


(2) Storage - https://www.fusetools.com/learn/fusejs#storage


Camera API 로 생성한 이미지를, 안드로이드 이미지 폴더에 복사(이동) 하기 위해 사용하려 했었던 API다.

하지만 상세 스펙을 보면 

'The storage API allows you to save text to files in the application directory.'

라고 한다. 이미지를 저장해보려 테스트를 해보니, 에러를 뱉진 않았지만, 결과값이 에러 값을 저장하고 있었다.

Camera로 생성한 이미지를 따로 저장하기 위해서는 다른 방법을 찾아봐야 할 것 같다.


3. 구현


(1) 화면 구성 

ui구현이 목적이 아니기 때문에, FUSE 에서 제공한 Slides using PageControl 예제를 수정하여 화면을 구성하였다.

Style 과 assets 들은 예제와 같기 때문에 MainView.ux 코드만 첨부한다.


MainView.ux 

    1. <App Theme="Basic" Background="#fff">
    2.     <DockPanel>
    3.             <MainStyle />
    4.                 <Page>
    5.                     <Info>
    6.                         <Header>
    7.                             <Text TextColor="#a94442" Value="{myfilePath}" Alignment="Center" />
    8.                             <Text TextColor="#a94442" Value="{errorMessage}" Alignment="Center" />
    9.                         </Header>
    10.                             <Button Text="Take a photo!!" ux:Name="button1" Clicked="{myTakePicture}" />
    11.                             <Button Text="Save a photo!!" ux:Name="button2" Clicked="{mySavePicture}"/>
    12.                     </Info>
    13.                     <BackgroundImage File="{myfilePath}" />
    14.                 </Page>
    15.     </DockPanel>
    16. </App>


(2) Camera 연동

카메라 촬영 후, 화면에 표시하기 위해 Observable API와 함께 작성하였다.


Camera.takePicture 의 너비와 높이 값은 결과물에 영향을 주지 못했고, takePicture 가 리턴해주는

file 객체에서 path 를 꺼내 myFilePath 에 연결하였다.

(file 객체를 이용하여 storage 에 저장하려 했으나, 실패하였다.)


2,3번 줄에서 사용할 객체 선언.

8번째 줄에서 takePicture 함수 선언.


16,19번 줄에서 모듈에 등록.


MainView.ux

    1. <App Theme="Basic" Background="#fff">
    2.     <JavaScript>
    3.         var Observable = require("FuseJS/Observable");
    4.         var Camera = require('FuseJS/Camera');
    5.  
    6.         var myfilePath = Observable();
    7.  
    8.         var myTakePicture = function() {
    9.             Camera.takePicture({ targetWidth: 640, targetHeight: 360}).then(function(file) {
    10.                 myfilePath.value = file.path;
    11.             }).catch(function(e) {
    12.                 console.log(e);
    13.             });
    14.         }
    15.  
    16.         module.exports = {
    17.             myfilePath: myfilePath,
    18.             myTakePicture: myTakePicture
    19.         };
    20.     </JavaScript>
    21.     <DockPanel>
    22.             <MainStyle />
    23.                 <Page>
    24.                     <Info>
    25.                         <Header>
    26.                             <Text TextColor="#a94442" Value="{myfilePath}" Alignment="Center" />
    27.                         </Header>
    28.                             <Button Text="Take a photo!!" ux:Name="button1" Clicked="{myTakePicture}" />
    29.                     </Info>
    30.                     <BackgroundImage File="{myfilePath}" />
    31.                 </Page>
    32.     </DockPanel>
    33. </App>


(3) 테스트


초기화면

촬영 후 화면

사진 아래에 파일 경로가 출력된 것을 볼 수 있다.


파일 저장 경로 확인

Android > data > 앱이름 > files 에 이미지가 저장 된 것을 확인할 수 있다.

4. 정리


카메라 호출 속도가 기존의 하이브리드 앱 툴에 비해 눈에 띄게 빨라서 놀랐다.

베타 환경이라는 점을 고려하면, 앞으로 하이브리드 앱을 개발하는데 있어서 점유율이 올라갈 것 같다.

아직 Native filesystem 을 이용할 수 있는 API 가 부족하여 촬영한 이미지를 갤러리 폴더로 옮기지 못했지만

기본이 되는 기능이므로 Fuse tools 에서 빠른 시일 내에, 업데이트할 것으로 예상한다.

이미지를 활용한 앱을 개발하기 위해서는 당분간 촬영한 이미지를 서버에 저장 가공 후, 제공해주는 형태로

개발을 진행하는 것이 좋겠다.


작성 코드 중 개선할 부분이나, 틀린 부분 지적해주시면 감사히 반영하도록 하겠습니다.


5. 참조

https://www.fusetools.com/


+ Recent posts