와....

안드로이드에서 Adobe AIR어플이 돌아가네요. 일단 포딩할만한 어플이 없어서(저는 대부분 Flex로 작업을 해서-_-) 공씨님이 전에 플래시액션스크립트 카페에서 발표했던 자료를 가지고 포팅해봤어요-_-
http://flashist.tistory.com/68

일단 하드웨어 가속 기능이 현재 pre-release버전에는 지원되지 않아서 그래픽 관련된 것에 퍼포먼스는 상당히 떨어진다고 얘기를 하는 듯 하네요. 그래서 공씨님이 만든 이 아트웍플래시 같은 건 느리게 돌아갈 수 밖에 없는 듯. 물론 최적화하는 방법이 있을 것 같긴 한데, 제가 몰라서..-_- 저 소개한 블로그에서 나온 게임들은 대체 어디서 받아서 해볼 수 있는건지... 동영상을 보면 굉장히 부드럽게 구현되어있는데, 코드를 보고 싶네요 ㅠㅠ

환경은 Android 2.1이상에서만 되는 듯.

방식은 이렇습니다. Adobe AIR 런타임을 안드로이드폰에 설치해야합니다. 그리고 Flash 등을 이용해 apk파일로 만든 파일을 설치하면 런타임이 설치가 되어있으면 실행이 됩니다. 이런방식인 듯.

소개한 블로그입니다.
http://blogs.adobe.com/air/2010/05/air_android_prerelease.html

그 어도비랩사이트 가면 실제 런타임과 Adobe AIR2.5 SDK를 받아서 개발할 수 있습니다.
http://labs.adobe.com/technologies/air2/android/

아...그리고 개발방식은 역시나 Flash CS5를 이용하는 방법과 Flash Builder를 이용하는 방법이 있는데요. 아직 flex프레임워크로는 안되는 듯 합니다. 디폴트로 WindowedApplication이 있어야하는데, 이 안드로이드는 윈도우 방식이 아니다보니...-_- 순수 ActionScript로 짤 수 있습니다.

하지만 Flash builder를 이용하게 되면 디버깅이나 테스트를 해볼 수 없습니다-_- 실제 에뮬레이터나 폰에 배포하기 전까지 모양을 볼 수 없어요. 정신 건강상 Flash CS5를 이용하시는 게 ^^ 일단 Flash CS5기준으로 설명을....


1. 런타임 설치

랩사이트가서 가입하고 로그인하면 파일들을 받을 수 있습니다.
근데, 런타임이 Device용이랑 Emulator용이 따로 있음. 어쨌든, 런타임을 받으면 6메가 정도인데, 설치하면 20메가 입니다(내 모토로이 용량도 없는데....ㅠㅠ).

2. Flash CS5 확장기능 설치

랩사이트에서 Flash CS5에서 AIR for Android Extension for Flash CS5를 받은다음에, Adobe Extension Manager CS5를 이용해서 설치를 합니다. 그런다음에 Flash CS5를 실행하면 새로운 템플릿이 하나 생깁니다.
AIR for Android에서 480x800Android 모냥이 하나 생깁니다.

3. 이제 셋팅 끝 개발-_-

이제 그냥 개발하면 되는 듯-_-

4. 배포 및 실행

오른쪽에 속성에 보면 AIRAndroid 설정이 있는데, 그거 편집누르면 다양한 publish옵션이 있습니다. 인증서 선택하고, 비밀번호 치고, 그다음에 Android SDK의 adb.exe파일 경로까지 잡아주면 배포후에 바로 실행도 할 수 있습니다.
사용자 삽입 이미지


5. 구동화면

사용자 삽입 이미지

물론 실제 Adobe AIR용 API는 사용해보진 않았는데, ActionScript로만 Android어플을 만들 수가 있는 것이네요. 근데 꼭 Adobe AIR런타임을 거쳐야하는지가 의문이 드네요. 그냥 apk파일로 만들어지는 거라면...... 아....안되겠구나..... 쓰다보니 사실 java에서 쓰이는거랑 Adobe AIR에서 쓰이는거랑 완벽하게 포팅을 할 순 없겠죠. 뭔 소린지....-_-

어쨌든, 그냥 신기...하지만 프리릴리즈기때문에, 뭐 아직 멀은 듯.

PS. Flash Player for Android도 나오긴 나왔는데, Android 2.2버전에서만 되어서 모토로이에서 테스트해볼 수 없네요. 넥서스원이 2.2업할 수 있다고 하는데, 한번 구동하는 걸 보고 싶네요^^

 
Posted by 머드초보

댓글을 달아 주세요

  1. 김정욱 2010.11.21 21:25  댓글주소  수정/삭제  댓글쓰기

    아진짜 p12파일 부럽네요 저는 지금 한달째해매다가 거의 포기했어요...... 아이팟 개발하려는데
    어떻게해야 받을수있죠??
    happykju1218@naver.com

    • 머드초보 2010.12.05 20:22  댓글주소  수정/삭제

      인증서 eclipse로 adt설치하시고 안드로이드 배포할 때 인증서 자기인증으로 생성할 수 있습니다. 그걸로 해도 됩니다^^

  2. 정혜림 2011.04.20 13:56  댓글주소  수정/삭제  댓글쓰기

    Adobe AIR2.5 SDK (flashpro_extensionforair_p1_102510.zxp 파일)
    이거를 현재는 구할수가 없네요. 어도비에서 다음버젼에 추가하례정이라 배포하지않는데 혹시 가지고 계신것을 보내주실수 있으실까요???


    bangmadam@naver.com

 
Adobe AIR 2에서는 제한적으로 프로세스를 실행할 수 있는 기능이 추가되었습니다. NativeProcess클래스인데요. 이 기능을 제공하는 이유는 그런 것 같습니다. AIR에서 안되는 거 C로 짠거랑 데이터 통신할 수 있는 게 주 목적인 듯.
Java처럼 그냥 exe파일 실행하는 것은 안되구요. 샌드박스에 위배되지 않는 파일만 실행할 수 있습니다.
즉, document폴더나 application폴더, 또는 applicationstorage 등과 같은 폴더에 있는 것은 자동으로 실행시킬 수 있지만, 그 외에 파일들은 사용자가 선택한 것만 실행할 수 있습니다. 즉, 열 수 있는 파일과 샌드박스안에 있는 파일만 실행할 수 있다는 얘기죠^^
안그럼 이런 에러가 뜨는 것 같습니다.
NativeProcessStartupInfo.executable does not specify a valid executable file.

뭐 사용자가 exe파일 선택만 해준다면야 모든 실행파일을 실행할 수 있네요.

우선 플래시 빌더를 다운로드를..ㅠㅠ
Flash Builder4 beta2 다운로드

아래 예제는 그냥 실행파일 선택하면 그 실행파일을 실행해주는 예제입니다.
[code]<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/halo">
    <fx:Script>
        <![CDATA[
            import flash.events.Event;
            import flash.events.MouseEvent;
            import flash.net.FileFilter;
           
            import mx.controls.Alert;
           
            private var nativeProcess:NativeProcess;
           
            protected function btnRun_clickHandler(event:MouseEvent):void
            {
                if (NativeProcess.isSupported)
                {
                    var file:File = new File();
                    file.addEventListener(Event.SELECT, selectHandler);
                    file.browseForOpen("실행파일을 선택하세요", [new FileFilter("exe파일", "*.exe")]);
                }
                else
                {
                    Alert.show("NativeProcess를 지원하지 않음.");                       
                }
            }
           
            private function selectHandler(event:Event):void
            {
                var file:File = event.currentTarget as File;
               
                var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
                //var args:Vector.<String> = new Vector.<String>;
                //args.push("/root,c:\\");
                //nativeProcessStartupInfo.arguments = args;
                nativeProcessStartupInfo.executable = file;
                nativeProcess = new NativeProcess();
                nativeProcess.start(nativeProcessStartupInfo);
               
            }
        ]]>
    </fx:Script>
   
    <s:Button id="btnRun" label="실행파일 선택"  click="btnRun_clickHandler(event)"/>
</s:WindowedApplication>[/code]
예제의 핵심은 NativeProcess클래스랑 NativeProcessStartupInfo클래스입니다.
NativeProcessStartupInfo클래스에 해당 file이랑 arguments를 넣어주고, NativeProcess로 실행하면 됩니다^^
그리고 Descriptor파일에 한줄 추가해줘야 하는 것 같은데요.
[code]<supportedProfiles>extendedDesktop</supportedProfiles>[/code]
왜 추가 안해도 잘 되지-_- 깜빡하고 추가안했는데, 잘 돼요. 이거 추가안하면 통신이 안되나...암튼 잘 모르겠네요.
근데, 저거 추가하고, Flash Builder에서 제공하는 빌더로 export하면 에러납니다-_-
[code]Error creating AIR file: NativeProcessTest-app.xml: error 306: Descriptor must support the profile desktop, mobileDevice, or extendedMobileDevice.[/code]
이거 웬지 Builder에서 제공하는 것은 1.5로 패키징하는 것 같음-_-
암튼, 저거 빼고 해서 air파일을 만들어도 실행하면 설치가 안됩니다. 이런 에러메세지가 나는군요.
[code]This application has been designed for a different device profile and will not run on your system. Contact the application author to see if a compatible version is available.[/code]
그래서 adt를 이용해서 command line으로 직접 패키징을 해야합니다. 아.....난 콘솔이 싫은데.....

우선 amxmlc로 컴파일합니다.
[code]amxmlc NativeProcess.mxml[/code]
그러면 NativeProcess.swf파일이 생김.
이제 패키징을 하면 됩니다.
[code]adt -package -storetype pkcs12 -keystore c:\Users\mudchobo\Documents\mudchobo.p12 -target native NativeProcessTest.exe NativeProcessTest-app.xml NativeProcessTest.swf[/code]
-keystore값에는 자기인증서 경로를 적구요. -target은 native로 하면 exe파일로 생성됩니다.
그리고 포함할 파일을 적으면 되구요.
그리고 빌더로 만든 *-app.xml파일을 보시면 <content>태그가
[code]<content>[This value will be overwritten by Flash Builder in the output app.xml]</content>[/code]로 되어있는데, 이거 swf파일 경로 적어 줘야합니다.
[code]<content>NativeProcess.swf</content>[/code]
비밀번호 입력하면 NativeProcessTest.exe파일이 생성되는데, 그거 실행하면 설치화면이 뜹니다.
이 설치파일은 기존 air파일로 패키징한거랑 틀리게 배경이 흰색이네요-_-

사용자 삽입 이미지
암튼, 설치하고 나면 실행 잘 됩니다.

※참고로 제가 탐섹히를 실행하려고 해봤는데, 이런 기능이 필요한 이유가 어떤 다운로드프로그램에서 사용자가 받은 파일이 있는 폴더를 손쉽게 열 수 있게 하는 것이 목표인데, 그럴려면 탐색기 실행이 필요합니다.
그래서 그냥 패키징할 때 탐색기 프로그램을 같이 패키징해버리면 보안샌드박스에 있기 때문에 실행할 수 있습니다-_-
c:\Windows\explorer.exe파일을 복사해서 패키징해버리고, 실행하면 탐색히가 뜹니다.
해당 폴더를 여는건 explorer.exe /root,c:\\로 하면 된다는.......-_-

마지막으로 다시한번 플래시빌더를 다운로드를-_-

Flash Builder4 다운로드

참고자료
http://www.adobe.com/devnet/air/flex/quickstart/interacting_with_native_process.html
 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon sewonist 2009.11.25 00:51  댓글주소  수정/삭제  댓글쓰기

    와우~ AIR2 에서 달라진게 뭐가 있는 두리번 거리고 있었는데 이건 조금 대박이네요. 결국 샌드박스 안에만 있으면 .exe 파일을 실행 시킬 수 있다는 의미인거죠? 당장 내일 테스트 해봐야겠습니다.

    • 머드초보 2009.11.25 11:29  댓글주소  수정/삭제

      네 자기가 c나 다른 언어로 짠 것을 air에 포함시켜서 그 프로그램과 통신도 할 수 있죠.
      방문해주셔서 감사해요~ ^^

  2. flex초보 2010.03.11 14:08  댓글주소  수정/삭제  댓글쓰기

    근데요 꼭 c로 짠 exe만 실행할 수 있나요???
    C# 으로 짠 exe는 상호 통신할 수 없나요???
    혹 있으시면 알려주세요 ㅠ

  3. BlogIcon grimtong 2010.04.05 16:01  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 우선 정보 감사합니다.
    Flex3에서 NativeProcess관련해서 설명해주신대로 수동 컴파일까지는 성공했습니다.
    컴파일된 exe파이를 설치를 하고 실행까지는 잘 동작합니다.

    그런데 nativeProcess관련하여 commandLine 명령어를 지원하는 exe 프로그램이 AIR에서 start를 하면
    커맨트창이 잠깐 보였다가 실행되고 꺼집니다...
    이창을 숨기거나 안나오게 하는 방법이 있는지요?

    ^____________^

    • 머드초보 2010.04.09 10:19  댓글주소  수정/삭제

      안녕하세요~
      저도....NativeProcess그냥 나왔을 때 잠깐 해본거라ㅠㅠ
      잘 모르겠습니다 ㅠㅠ

  4. 2010.07.27 16:42  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 머드초보 2010.07.28 20:47  댓글주소  수정/삭제

      음...혹시...프로젝트이름을 NativeProcess로 하셨나요?
      몬가 충돌이 일어나는 것 같아보이는데....

  5. 플래시 2010.09.24 13:52  댓글주소  수정/삭제  댓글쓰기

    머드초보님..
    저는 플렉스는 모르지만 플래시는 아는데요.
    Flash CS5로 그냥 텍스트툴을 사용해서 t라는 텍스트필드를 만들고
    t.text = NativeProcess.isSupported.toString();
    이렇게 액션을 준 후 app xml에는 다음과 같이 주었습니다.
    <supportedprofiles>extendedDesktop desktop</supportedprofiles>
    그리고 플래시 속성창의 Air2 설정의 [편집]버튼을 눌러서 제작 버튼을 누르면 air파일은 만들어지는데
    <supportedprofiles>노드가 없어져 버립니다.
    그래서 air파일을 실행해서 보면 텍스트필드에도 NativeProcess.isSupported가 false로 나옵니다.

    <supportedprofiles>extendedDesktop</supportedprofiles> 이렇게만 줘도 없어져 버리거든요.
    어떻게 하면 <supportedprofiles>노드를 없애지 않을 수 있을까요?

    • 머드초보 2010.11.05 19:21  댓글주소  수정/삭제

      음...이거 베타 때 한것이고, Flash에서 해보질 않아서 잘 모르겠네요ㅠㅠ
      뭔가 정책이 바뀐 것 같은데, adobe 문서를 확인해보시면ㅠㅠ

 
Adobe AIR 2.0 Beta가 Release되었네요.
Adobe AIR Team 블로그 글 - http://blogs.adobe.com/air/2009/11/adobe_air_2_beta_now_available.html

릴리즈노트는 여기서 - http://labs.adobe.com/wiki/index.php/AIR_2:Release_Notes#Overview

저의 짧은 실력의 릴리즈 노트를 보면......-_-

1. 해당 파일에 대한 기본 애플리케이션으로 지정된 프로그램을 실행할 수 있습니다. 이게 뭔 얘기냐면 doc파일이 word에 지정되어있으면 doc파일을 열어서 word를 실행할 수 있는 기능인 듯-_-

2. 마이크 데이터 엑세스. 마이크 데이터를 저장하고 뭐 삽질할 수 있나봅니다.

3. 대용량 저장소에 대한 발견이 가능해졌는데요. 예를 들어 USB를 연결하게 되면 그걸 AIR프로그램에서 인식할 수 있습니다.

4. 업데이트된 WebKit version. air에서 사용하는 브라우저엔진이 그냥 업데이트 됐다는 것 같은.....

5. 글로벌 에러 핸들링은 뭐지.....

6. 새로운 네트워크 지원. AIR프로그램이 서버프로그램이 될 수 있게 ServerSocket을 지원하네요. 그 외에 UDP랑 TLS/SSL도 지원한다고 써있지만, UDP빼곤 잘 몰라서-_-
아.....네트워크 인터페이스 목록이라는 부분은 그거 같은데, 네트워크 정보를 얻어올 수 있는 그런거. 맥어드레스같은 거 AIR에서 못 읽어왔는데, 읽어올 수 있나봅니다.

7. EXE파일의 PACKAGING이 가능. 원래 AIR파일이 나오는데, 이제 exe파일로도 패키징을 할 수 있습니다.

8. native process API. 이건 다른 프로그램을 AIR프로그램이 실행할 수 있는 API인데, 조금 삽질해보니 제약이 좀 있음. 패키징할 때 지정한 것만 되는 것 같음. 좀 더 삽질을 해봐야할 듯 ^^ 암튼, 프로그램을 제약적이지만 실행할 수 있어요.

9. 데이터베이스 트랜젝션 어쩌구 하는데 잘 모르겠음

다 적으려니까 디게 많네.....-_-
그냥 그외에, 향상된 IPv6을 지원하고, Native Window의 최대사이즈를 증가시켰고, 멀티터치지원하고, IME향상시켰고....영어공부해야겠다.

구축하기에 앞서 Flash Builder 4 Beta 2 다운로드
Flash Builder4 다운로드

1. 개발환경 구축
사실 개발환경 구축이라고 하기에는 너무나 간단하지만....-_- 그냥 AIR SDK받아서 Flash Builder 4가 설치된 폴더 안에 있는 sdk에 덮어 씌우면 됩니다.
우선 Adobe AIR 2 Beta SDK와 Runtime 다운로드 - http://labs.adobe.com/downloads/air2.html
받은 sdk파일 (air2_b1_sdk_win_11709.zip)을 Flash Builder 2 sdk폴더에 압축을 덮어씌워서 풀어버립니다. 저의 경로는 아래와 같군요.
C:\Program Files (x86)\Adobe\Adobe Flash Builder Beta 2\sdks\4.0.0

2. 개발하면 돼요-_-

3. 예제 작성
[code]<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/halo"
                       width="500" height="500"
                       applicationComplete="windowedapplication1_applicationCompleteHandler(event)">
    <fx:Script>
        <![CDATA[
            import flash.events.StorageVolumeChangeEvent;
            import mx.events.FlexEvent;

            protected function windowedapplication1_applicationCompleteHandler(event:FlexEvent):void
            {
                StorageVolumeInfo.storageVolumeInfo.addEventListener(StorageVolumeChangeEvent.STORAGE_VOLUME_MOUNT, mountHandler);
                StorageVolumeInfo.storageVolumeInfo.addEventListener(StorageVolumeChangeEvent.STORAGE_VOLUME_UNMOUNT, unmountHandler);
            }
           
            private function mountHandler(event:StorageVolumeChangeEvent):void
            {
                trace(event.rootDirectory.nativePath);   
                taInfo.text += "drive = " + event.storageVolume.drive + ", type = " +
                    event.storageVolume.fileSystemType + ", name = " + event.storageVolume.name + "\n";
            }
           
            private function unmountHandler(event:StorageVolumeChangeEvent):void
            {
                taInfo.text += event.rootDirectory.nativePath + " 제거됨\n";
            }
        ]]>
    </fx:Script>
    <s:TextArea id="taInfo" x="6" y="10" width="484" height="480" verticalScrollPolicy="on"/>
</s:WindowedApplication>[/code]

핵심은 StorageVolumeInfo클래스랑 StorageVolumeChangeEvent클래스입니다. 그냥 MOUNT, UNMOUNT이벤트 걸어주면 지가 알아서 다함^^
사용자 삽입 이미지
참조사이트
http://www.adobe.com/devnet/air/flex/articles/exploring_file_capabilities.html
 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 지돌스타 2009.11.18 14:10  댓글주소  수정/삭제  댓글쓰기

    좋은 예제 잘보고 가요~ 트랙백 걸고 갑니다.

  2. BlogIcon hansoo 2010.02.09 12:01  댓글주소  수정/삭제  댓글쓰기

    좋은 예제 잘 익히고 갑니다~

  3. BlogIcon uggs for cheap 2011.11.08 11:35  댓글주소  수정/삭제  댓글쓰기

    With beautiful appearance and unique designs make the <a href="http://www.fashionuggsforcheaps.com">cheap uggs</a> become more attractive. <a href="http://www.fashionuggsforcheap.com">uggs</a> come in a variety of colours and styles to suit individual tastes, so you can be a fashionable, warm and most importantly comfy!For most of us, boots in our uggs sale have become the daily equipment. Catch the fashion by choosing the fantastic <a href="http://www.fashionuggsforcheaps.com">uggs for cheap</a>.

  4. BlogIcon uggs for cheap 2011.11.08 11:36  댓글주소  수정/삭제  댓글쓰기

    UGG Australia is a brand that is all about luxury and comfort for everyday life.[url=http://www.fashionuggsforcheaps.com]uggs[/url] are a unisex style of sheepskin boots, made of twin-faced sheepskin with fleece on the inside and with a tanned outer surface, often with a synthetic sole.welcome to [url=http://www.fashionuggsforcheaps.com]cheap uggs[/url].we have [url=http://www.fashionuggsforcheaps.com]uggs for cheap[/url]

 
문서를 보니..... 향상된 것인지 아님 기능이 더 추가되고 복잡해진 것인지 모르겠군요-_- 익숙해지면 편하겠지만, 지금은 현재 Flex3방식의 state가 더 편해보이네요-_-

예전에 어도비에서 RIA CAMP할 때 STATE기능의 향상이 있을 것이라고 해서 찾아보니 완전히 바뀌었네요.

우선 Flash Builder 4 Beta 2를 다운로드 해서 설치를.....ㅠㅠ

기존 Flex3 방식은 <mx:states> 태그안에 <mx:State>태그가 있는데, 이 안에서 AddChild나 SetProperty태그를 이용해서 해당 state로 변경이 되면 컴포넌트를 삭제하고 추가하거나 값을 변경하는 코드가 들어갔었죠.

Flex4 방식은 위와 같은 방식에서 완전히 바뀌었습니다(사실..flex4로 오면서 거의다 바뀌었다는....).
<s:states>태그안에 <s:State>태그가 들어가는 것은 같지만, 여기서 컴포넌트를 추가하거나 변경하는 코드는 들어가지 않습니다. 그냥 다음에 xml코드에서 해당 컴포넌트들에게 적용을 하게 됩니다. 컴포넌트 태그에 해당 state값에 맞는 코드를 중복으로 선언할 수 있습니다.
해당 State의  Name들이 default, register라면 <s:Panel title="제목" title.register="등록제목" /> 이런형태로 써버리면 currentState가 register로 바뀌면 자동으로 Panel의 title이 title.register값으로 변경이 되게 됩니다.

상세한 기능 및 설명은 Flex 4문서를 보시는 게 더 빠를 듯 합니다.
http://help.adobe.com/en_US/Flex/4.0/UsingSDK/WS2db454920e96a9e51e63e3d11c0bf69084-7fb4.html
http://www.artima.com/articles/flex_4_states.html

1. 디자인모드에서 state설정
그럼 Flash Builder를 실행해서 여기서 State를 설정해봅시다.
Flex로 프로젝트를 하나 만듭니다.
Design모드로 전환!
오른쪽 States View가 있는데, 거기에서 New State를 선택해서 추가합니다.
addbutton이라는 state를 추가합니다. 그리고 기존에 있던 State1은 default로 변경합니다.
그럼 states를 addbutton으로 맞춰놓고, 버튼을 드래그해서 놓습니다.
그리고 Source뷰로 바꾸면 이런 코드가 완성이 되네요^^
[code]<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768">
    <s:states>
        <s:State name="default"/>
        <s:State name="addbutton"/>
    </s:states>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Button includeIn="addbutton" x="308" y="231" label="Button"/>
</s:Application>[/code]
Button에 includeIn이라는 attribute값이 들어가있고 거기에 state값이 있네요. 이 버튼은 addbutton일 때만 보이겠다는 것이죠. 아마 이 새로 바뀐 state형태는 기존 ui를 구성하는 mxml코드를 최대한 방해받지 않게 하려고 만든 것 같습니다.
그리고 재미있는 것은 편집 상단에 Show state: 부분이 있는데, state를 default로 바꾸면 button태그부분이 회색으로 dim처리가 되어버립니다-_- 와 멋지네요. UI작성에 방해받지 않게 하려는 배려인 듯.
사용자 삽입 이미지

dim처리...-_-

2. STATE별 이벤트 추가
state별 이벤트 뿐만 아니라 뭐 다양하게 추가할 수 있어요.
Design모드에서 그냥 addbutton state선택하고, 아까 추가한 버튼을 누르면 Properties를 설정할 수 있는데 In states를 클릭해서 All States로 바꿔줍시다^^
그러면 default에서도 나오는데, 버튼선택해서 오른쪽버튼 누르면 generate Service Call이라는 것이 있는데, 그걸 누르면 자동으로 click이벤트 함수를 만들어줍니다.
두개의 state에서 동시에 만들어버리면 이렇게 나오는군요.
사용자 삽입 이미지

신기함-_- 다른 state함수만 dim처리됨-_-

그 외의 자세한 기능은 문서를 참조하면 돼요. 문서에 샘플예제가 참 잘 나와 있습니다. Flex의 장점은 잘 된 문서화(?)가 아닐까합니다. 한글화가 안되어있는 것이 아쉽긴 하지만....ㅠㅠ

빌더는 여기서 다운로드를...ㅠㅠ


 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 찬욱 2010.04.08 16:47  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    요즘 플렉스 공부를 시작했는 데 유용한 글이 많아 많은 도움 받고 있습니다.
    감사합니다. 수고하세요~

    • 머드초보 2010.04.09 10:43  댓글주소  수정/삭제

      앗~ 찬욱님 반갑습니다^^ 잘지내시죠?^^
      저도 플렉스허접이라-_-
      자바랑 참 잘 맞는 프레임워크라 참 좋아요~

 
음... air.swf를 이용하면 설치된 애플리케이션을 실행할 수 있으며, Adobe AIR가 설치가 되어있지 않으면 설치도 할 수 있는 기능이 있는 SWF입니다.
http://airdownload.adobe.com/air/browserapi/air.swf

음....문제점이 한쪽에서 air.swf를 로딩하고 나서 getApplicationVersion(애플리케이션이 설치되었는지 확인하는 함수)을 하고 있습니다. 그런데 다른 한쪽에서 air.swf를 로딩해서 getStatus(air가 설치되어있는지 상태값 받기)를 하면 air가 설치 되어있음에도 불구하고 available(AIR설치는 안되어있으나 설치가 가능함)을 받는 경우가 발생합니다.

그래서 더 찾아보니 우야꼬님의 글을 보다가 알았는데요. air.swf 없이도 AIR애플리케이션을 설치하고 실행할 수 있다고 한다는 글을 보았습니다. 그래서 이 현상이 버그인지 확인해보려고 직접 구현하려고 했지만........-_-
생각보다 조낸 어렵네요-_- 우야꼬님께서 ProductManager클래스를 이용해야 한다는 힌트만 주셔서 ㅠ
ProductManger는 뭐하는 놈인지 검색해도 잘 안나와요-_- 어디서 뜯어봐야하는지ㅠ 근데 이놈을 이용해서 AIR애플리케이션을 리스타트하는 프로그램을 만들 수도 있더라구요.
http://www.hufkens.net/2009/03/how-to-restart-an-air-application-from-code/
productmanager가 air프로그램 실행하고 그러는 것 같긴 한데, launch라는 함수가 있는데 이것에 대한 커맨드라인 명령어 같은 게 설명이 잘 안나왔네요 ㅠ

암튼, air.swf를 로딩해서 getApplicationVersion을 무한 반복하는 애플리케이션을 만들고, 그걸 2개를 띄워볼께요-_-
AirService.as
[code]package
{
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
   
    public class AirService extends EventDispatcher
    {
        private var _loader:Loader;
        public var _service:Object;
       
        public function AirService()
        {
            _loader = new Loader();
            var context:LoaderContext = new LoaderContext();
            context.applicationDomain = ApplicationDomain.currentDomain;
            _loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
            var swf:String = "http://airdownload.adobe.com/air/browserapi/air.swf";
            var request:URLRequest = new URLRequest(swf);
            _loader.load(request, context);
        }
       
        private function initHandler(event:Event):void
        {
            _service = _loader.content;
            dispatchEvent(new Event(Event.COMPLETE));
        }
       
        public function getStatus():String {
            return _service.getStatus();
        }
       
        public function getApplicationVersion(applicationId:String, publisherId:String, callback:Function):void
        {
            _service.getApplicationVersion(applicationId, publisherId, callback);
        }
       
        public function installApplication(url:String, runtimeVersion:String, parameters:Array = null):void
         {
            _service.installApplication(url, runtimeVersion, parameters);        
         }
        
         public function launchApplication(applicationId:String, publisherId:String, parameters:Array = null):void
         {
             _service.launchApplication(applicationId, publisherId, parameters);
         }
    }
}[/code]
Main.mxml
[code]<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="vertical" verticalAlign="middle"
    applicationComplete="applicationCompleteHandler()" width="100%" height="100%">
   
    <mx:Script>
        <![CDATA[
            import adobe.utils.ProductManager;
           
            private var airService:AirService;
           
            private function applicationCompleteHandler():void
            {
                airService = new AirService();
                airService.addEventListener(Event.COMPLETE, completeHandler);
            }
           
            private function completeHandler(event:Event):void
            {
                trace(airService.getStatus());
                ta.text += airService.getStatus() + "\n";
                if (airService.getStatus() == "installed")
                {
                    airService.getApplicationVersion("AirApplication",
                        "2D0F512A27635B8D26E3FE2622F4AAEDDA9D3CFC.1",
                        applicationVersion);
                }
            }
           
            private function applicationVersion(version:String):void
            {
                trace("version=" + version + ", status = " + airService.getStatus());
                ta.text += "version=" + version + ", status = " + airService.getStatus() + "\n";
                ta.verticalScrollPosition = ta.maxVerticalScrollPosition;
                airService.getApplicationVersion("AirApplication",
                    "2D0F512A27635B8D26E3FE2622F4AAEDDA9D3CFC.1",
                    applicationVersion);
            }
           
        ]]>
    </mx:Script>
    <mx:TextArea id="ta" height="100%" width="50%"/>
</mx:Application>[/code]
두개를 띄워보면
사용자 삽입 이미지
한놈은 available을 받습니다-_- 왜그러지-_-
대체 getApplicationVersion에서 어떤 일을 하는지 궁금해지기 시작했습니다.

그래서 대처 방법으로는....-_- getApplicationVersion을 동시에 하지 않으면 돼요-_- 사용자가 클릭할 때 하면 되는데, 이렇게 되면 launchApplication을 할 때에 또 클릭해줘야 해요. launchApplication은 사용자 액션에 의해서만 되더라구요.

PS. 혹시......이 글을 보게 되시는 분들중에서.....AIR애플리케이션을 launch하는 사이트를 목격 하시면 댓글 달아주세요ㅠ

 
Posted by 머드초보

댓글을 달아 주세요

  1. 장문영 2009.06.04 15:57  댓글주소  수정/삭제  댓글쓰기

    http://msp.skbroadband.com 공인인증서 로그인 누르세요
    현재도 개발중이며 계속 버전업 중입니다.
    저도 이 현상을 겪었었습니다.우야꼬님 방명록에 물어봤던 흔적이 아직도 있을거에요...답변은 못들었지만-_-;

    추가로 air.swf 로딩을 하지않고 웹에서 Air를 launch 시키는 방법을 알게 되시면 포스팅 좀 해주세요 ㅎㅎ

    • 머드초보 2009.06.05 09:34  댓글주소  수정/삭제

      air.swf를 두군데서 로딩하나봐요
      저희도 두군데서 로딩을 해야해서 문제가 발생했는데,
      그냥 한개 로딩완료 후 다음swf에서 로딩하는 방식으로
      변경했었습니다^^
      공인인증서를 air로 하다니 대단하네요 ^^

  2. BlogIcon 우야꼬 2009.12.30 10:49  댓글주소  수정/삭제  댓글쓰기

    아이고 요즘 정신이 없어서 제대로된 포스팅을 못하고 있는데
    조만간 ProductManager에 대해서 제가 아는대로 한번 올려볼께요. ㅠ.ㅠ
    글 올리고나서 트랙백 쏘겠슴돠~ ㅎㅎ

    • 머드초보 2009.12.31 12:46  댓글주소  수정/삭제

      앗~ 우야꼬님 반갑습니다^^
      감사해요~
      아직도 저희사이트에서 AIR재설치 문제가 발생해서-_-
      저도 좀 알아보니까 getApplicationversion할 때 air.swf에서 로컬커넥션으로 어디다가 쏘는 것 같더라구요.
      음 그 과정에서 좀 문제가 생기는 것 같은데...
      암튼, 해보시면 알려주세요 ㅠㅠ

  3. 무로 2010.05.25 17:59  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 요즘 AIR 2.0에서 air.swf를 이용해서 PC의 AIR Application을 실행하는
    프로그램을 개발하는 중에 AIR 2.0 Runtime이 설치되어 있음에도 불구하고 getStatus 함수에서
    계속 "available" 문자열만 리턴하는 문제가 있어 여기까지 찾아오게 되었습니다~

    위에 포스팅하신 내용과는 조금 다른것 같지만 현상은 거의 동일해서
    제가 발견한 오류를 기록하고 가겠습니다 ^^;

    제가 발견한 오류는 AIR 2.0 Runtime을 PC에 바로 설치하였을 때 발생하였습니다.
    무슨 말씀이냐면 AIR 1.5 Runtime을 설치하고 AIR 2.0(정확히는 rc1) Runtime으로 업데이트하면
    getStatus 함수에서 "installed"라는 문자열을 리턴했지만 테스트를 하기 위해서 다른 PC에
    AIR 2.0 Runtime을 바로 설치했을 때는 계속해서 "available" 문자열만 리턴하였습니다.

    AIR 1.5 Runtime을 설치했을 때는 "C:\Documents and Settings\username\Application Data\Macromedia\Flash Player\www.macromedia.com\bin\airappinstaller" 디렉토리에 파일이 생성되던데 여기 있는 파일이 없을 경우 문제가 되더군요....
    AIR 2.0 Runtime을 바로 설치하였을 경우에는 디렉토리와 파일이 생성되지 않았으며 다른 PC에 있는 파일을 복사하면 "installed"가 리턴되었습니다.
    정식 릴리즈가 나오면 해결될지 모르겠습니다...

    오늘 급하게 확인한 것이라 정확한지는 모르겠지만
    같은 원인으로 고생하시는 분이 계실까봐 몇 자 적고 갑니다.

    PS. 블로그에서 많은 도움 받고 갑니다. 감사해요~ ^^

    • 머드초보 2010.06.03 18:07  댓글주소  수정/삭제

      저희사이트는 요즘도 발생해서 ㅠㅠ
      아직도 왜그런지 모르겠어요 ㅠㅠ

  4. 아무개 2011.11.18 10:03  댓글주소  수정/삭제  댓글쓰기

    airSWF.getApplicationVersion(appID, pubID, versionDetectCallback);
    function versionDetectCallback(version:String):void {
    trace(version);
    }

    이렇게 쓰는듯.