air어플을 만들어야할 것 같아서(근데 이제 취소된 듯-_-), ApplicationUpdater를 삽질해봤습니다.

일단 air 어플리케이션은 수정사항이 있으면 자동적으로 업데이트를 체크해서 어플을 업데이트하는 기능이 꼭 들어가야합니다. 그래서 ApplicationUpdater클래스를 이용해 삽질을 해봤습니다.

보면 ApplicationUpdaterUI라는 클래스도 있는데, 이건 ui적으로 기능이 이미 구현이 되어있는 것입니다. 사용자가 이런 ui를 새롭게 꾸미려면 ApplicationUpdater클래스를 이용해서 내부적으로 처리를 하고, 나머지 ui는 직접 꾸밀 수가 있습니다. 그래서 사용자가 직접 새로운 업데이트air파일을 받는 모습과 업데이트체크를 해서 현재 업데이트가 있는지 등을 구현할 수 있습니다.

사실 과정은 applicationUpdater.checkNow()한번 때려버리면 업데이트가 있으면, 논스톱으로 강제 업데이트를 시켜버리긴합니다만-_- 강제업데이트말고, 사용자에게 업데이트 과정을 알려주기 위해서 과정을 삽질해봤습니다.

강제 업데이트를 중지하려면 각각 프로세스별로 event 중지를 시켜야합니다.

[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="vertical" 
    title="Sample Version Checker Application"
    applicationComplete="applicationCompleteHandler()">
    <mx:Script>
        <![CDATA[
            import air.update.events.DownloadErrorEvent;
            import air.update.events.StatusUpdateErrorEvent;
            import air.update.events.StatusUpdateEvent;
            import air.update.events.UpdateEvent;
            import air.update.ApplicationUpdater;
             
            private var applicationUpdater:ApplicationUpdater;
            
            private function applicationCompleteHandler():void
            {
                // 현재버전 찍기
                   var appXml:XML = NativeApplication.nativeApplication.applicationDescriptor;
                var ns:Namespace = appXml.namespace();
                var appVersion:String = appXml.ns::version[0];
                log.text += "현재 어플리케이션버전 : " + appVersion + "\n";
               
                // ApplicationUpdater초기화
                applicationUpdater = new ApplicationUpdater();
                applicationUpdater.configurationFile = new File("app:/update.xml");
               
                // initialize할 때
                applicationUpdater.addEventListener(UpdateEvent.INITIALIZED, initializedUpdateEventHandler);
                applicationUpdater.addEventListener(ErrorEvent.ERROR, errorErrorEventHandler);
               
                // checkNow할 때
                applicationUpdater.addEventListener(StatusUpdateEvent.UPDATE_STATUS, updateStatusStatusUpdateEventHandler);
                applicationUpdater.addEventListener(UpdateEvent.CHECK_FOR_UPDATE, checkForUpdateUpdateEventHandler);
                applicationUpdater.addEventListener(StatusUpdateErrorEvent.UPDATE_ERROR, updateErrorStatusUpdateEventHandler);
               
                // downloadUpdate할 때               
                applicationUpdater.addEventListener(UpdateEvent.DOWNLOAD_START, downloadStartUpdateEventHandler);
                applicationUpdater.addEventListener(ProgressEvent.PROGRESS, progressProgressEventHandler);
                applicationUpdater.addEventListener(UpdateEvent.DOWNLOAD_COMPLETE, downloadCompleteUpdateEventHandler);
                applicationUpdater.addEventListener(DownloadErrorEvent.DOWNLOAD_ERROR, downloadErrorDownloadErrorEventHandler);
               
                // installUpdate할 때
                applicationUpdater.addEventListener(UpdateEvent.BEFORE_INSTALL, beforeInstallUpdateEventHandler);
               
                // 초기화
                applicationUpdater.initialize();
            }
           
            private function initializedUpdateEventHandler(event:UpdateEvent):void
            {
                log.text += "initialized : " + applicationUpdater.currentState +"\n";
                applicationUpdater.checkNow();
            }
           
            private function errorErrorEventHandler(event:ErrorEvent):void
            {
                log.text += "error : " + applicationUpdater.currentState + "\n";
            }
           
            private function updateStatusStatusUpdateEventHandler(event:StatusUpdateEvent):void
            {
                event.preventDefault();
                log.text += "update_status : " + applicationUpdater.currentState +"\n";
                log.text += "version : " + event.version + "\n";
                log.text += "available : " + event.available + "\n";
               
                if (event.available)
                {
                    applicationUpdater.downloadUpdate();
                }
            }
           
            private function updateErrorStatusUpdateEventHandler(event:StatusUpdateEvent):void
            {
                log.text += "update_error : " + applicationUpdater.currentState + "\n";
            }
           
            private function checkForUpdateUpdateEventHandler(event:UpdateEvent):void
            {
                log.text += "check_for_update : " + applicationUpdater.currentState + "\n";
            }
           
            private function downloadStartUpdateEventHandler(event:UpdateEvent):void
            {
                log.text += "download_start : " + applicationUpdater.currentState + "\n";
            }
           
            private function progressProgressEventHandler(event:ProgressEvent):void
            {
                log.text += "progress : " + event.bytesLoaded + "/" + event.bytesTotal + "\n";
            }
           
            private function downloadCompleteUpdateEventHandler(event:UpdateEvent):void
            {
                event.preventDefault();
                log.text += "download_complete : " + applicationUpdater.currentState + "\n";
                btnInstall.visible = true;   
            }
           
            private function downloadErrorDownloadErrorEventHandler(event:DownloadErrorEvent):void
            {
                log.text += "download_error : " + applicationUpdater.currentState + "\n";   
            }
           
            private function beforeInstallUpdateEventHandler(event:UpdateEvent):void
            {
                log.text += "before_install : " + applicationUpdater.currentState + "\n";
            }
           
            private function clickInstallHandler(event:MouseEvent):void
            {
                applicationUpdater.installUpdate();
            }
        ]]>
    </mx:Script>
    <mx:TextArea id="log" width="100%" height="100%" />
    <mx:Button id="btnInstall" click="clickInstallHandler(event)" visible="false" label="설치"/>
</mx:WindowedApplication>
[/code]

air안에 있는 update.xml파일
[code]<?xml version="1.0" encoding="utf-8"?>
 <configuration xmlns="http://ns.adobe.com/air/framework/update/configuration/1.0" >
   <url>웹에있는update.xml파일 주소</url>
   <delay>1</delay>
</configuration>[/code]

web에 올려진 update.xml파일
[code]<?xml version="1.0" encoding="utf-8"?>
<update xmlns="http://ns.adobe.com/air/framework/update/description/1.0">
  <version>1.5</version>
  <url>업데이트할 air파일 주소</url>
  <description>
      <![CDATA[update! 1.5!]]>
  </description>
</update>
[/code]

과정은 initialize()한다음에 checkNow()를 호출하면....
현재 업데이트가 있는지 update_status가 발생하면, 그 event변수에 version과 available값이 오는데, 거기에 available이 true면 업데이트가 있는 겁니다.
downloadUpdate()를 호출하면 파일을 막 다운로드하는데, 파일 받는 과정을 progressevent로 받을 수 있습니다.
완료가 되면 downloadComplete이벤트가 발생해서 installUpdate()를 때려주면 어플이 종료되고 업데이트를 시작합니다.

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

PS. 오늘따라....시간이 엄청 안가네-_-
 
Posted by 머드초보

댓글을 달아 주세요

  1. 달빛화가 2010.11.10 15:27  댓글주소  수정/삭제  댓글쓰기

    제가 머드초보의 블로그 내용을 가지고 ApplicationUpdater를
    그대로 이용해보았는데요.

    이상하게도 전 16803 에러가 발생하네요.
    아무리 뒤져봐도 16803에 대한 내용이 없어서 질문을 드립니다.
    혹시 왜 16803 에러가 발생하는지 알고 계시나요.?

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

      음..... 파일이 없거나 그러진 않는지?ㅠㅠ
      저도 그 에러에 대해선 잘 모르겠네요

  2. BlogIcon 박경석 2012.07.20 13:25 신고  댓글주소  수정/삭제  댓글쓰기

    "6803 잘못된 Adobe AIR 파일입니다(형식)"
    레퍼런스에 이렇게 나와 있는걸로 봐서 파일을 배포하실때 혹시 exe로 배포하신게 아닌지 생각됩니다. 업데이트 하려면 확장자를 air로 해서 배포해야 ApplicationUpdater를 사용할수 있다고 합니다.

 
최근 스티브잡스횽이 까고 있는 플래시-_-

CS5 한글판이 나와서 한번 깔아봤는데, 역시 전 한글이 편하네요-_- 어설픈 한글로 되어있어도 그냥 영어로 된 것 보단 낫다고 생각하는 1人...

일단 Flash랑 Flash Builder를 둘 다 깔아야해요~
안깔면 안깔려있다고 뭐라그래요~

일단 Flash에서 액션스크립트 편집기가 좋아졌다고 하는데(전 잘 안써봐서-_-), 여전히 안좋은 것 같은 느낌이 드는....
액션스크립트 클래스 편집은 그냥 Flash Builder에서 하면 맘 편하네요~
둘이서 연동이 되어서 빌더에서 에러 수정 및 편집이 매우 용이해요~

일단 플래시화면!
사용자 삽입 이미지
일단 Flash Builder도 같이 띄워놓아야 합니다. 안그러면 선택하라는 거 안나오는 것 같음.
여기서 ActionScript3프로젝트로 새로 만든다음에, ActionScript 3.0 클래스를 새로 만들면
"어떤 응용 프로그램에서 ActionScript3.0 클래스를 만들어야 합니까?"라는 말로 물어보고, Flash Professional인지 Flash Builder인지 선택할 수 있어요.
그러면 Flash Builder에서 해당 Flash프로젝트 파일인 fla파일을 선택하면 되는데요. 그러면 자동으로 프로젝트도 만들고, ActionScript Class만드는 창도 떠서 만들어지게 됩니다.
[code]package
{
    import flash.display.Sprite;

    public class DrawRect extends Sprite
    {
        public function DrawRect()
        {
            this.graphics.beginFill(0x000000);
            this.graphics.drawRect(0, 0, 100, 100);
            this.graphics.endFill();
        }
    }
}[/code]
사각형을 그리고~ flash에서 불러올 때 자동으로 DrawRect라는 클래스가 코드힌트로 나옴!
사용자 삽입 이미지

[code]var drawRect:DrawRect = new DrawRect();
this.addChild(drawRect);[/code]

사용자 삽입 이미지
잼있는 건 Flash Builder에서도 Control + Enter눌러도 된다는......
일단....여전이 Flash에서 ActionScript편집은 불편합니다. 그래서 얘네들이 Flash Builder 연동을 해서 하는 것 같은데, 정말 괜찮은 기능인 듯 합니다.
 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 길땡 2010.05.18 00:03  댓글주소  수정/삭제  댓글쓰기

    플렉스 그래프가 이쁜것 같아서. . .

    DB의 값을 받아와서 그래프로 만들어주려고 했는데. . .

    아직 그렇다할 자료가 ㅋㅋㅋㅋㅋ ㅠㅠㅠㅠㅠ

    그래도 여기와서 많은 정보 얻고 갑니다. . .ㅎㅎ

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

      아...일단 직접 다 구현하기 힘드시면 flex에서 제공하는 많은 차트가 있거든요. 그걸 사용하시는게^^
      이쁘고 좋습니다^^

  2. BlogIcon 성주 2010.06.16 12:43  댓글주소  수정/삭제  댓글쓰기

    저는 왜 FlashBuilder에서 Ctrl+Enter하면 줄바꿈이 될까요...

    • 머드초보 2010.06.19 14:45  댓글주소  수정/삭제

      Flash Builder랑 Flash CS5는 다른 어플리케이션입니다.
      위에껀 Flash CS5입니다^^

    • BlogIcon 성주 2010.06.21 10:24  댓글주소  수정/삭제

      알아냈어요!!
      Flash Builder에서 프로젝트 만들때 Flash Professional Project로 해서 fla 파일 연결하면 빌더에서 ctrl+enter로도 테스트무비를 할 수 있더라고요

    • 머드초보 2010.06.26 15:26  댓글주소  수정/삭제

      헐퀴~ Flash Builder에서도 되는군요 ^^

    • 2010.06.28 10:42  댓글주소  수정/삭제

      비밀댓글입니다

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

      헉-_-
      뭐지.....-_-
      내가 아닌 사람이 글을 쓴건가 ㅠㅠ
      그...그렇네요. 저 요즘 좀 오락가락해서 ㅠㅠ
      죄....죄송합니다 ㅠㅠ

  3. 2012.10.30 00:40  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

 
와~ 컨퍼런스다~ 전 이런곳을 참 좋아하는....-_-(카페활동도 안하고 눈팅만 하는 놈이.....-_-)
게다가 우리회사 근처에서 하네요. 매우 익숙한 AT센터의 숨막히는 뒷태.

암튼, 주말인데도 불구하고, 저의 출근버스 9500번을 타고, 마치 출근하는 기분으로 갔습니다ㅠㅠ
좀 늦게 갔는데, 이미 문군님이 발표를 하고 계시네요.


1. 디자이너를 위한 플래시 - 문군님

음... 늦게 가서 제대로 못들었습니다 ㅠㅠㅠㅠ


2. 쉽게 접하는 플래시 아트웍 - 공씨님

와~ KSUG(한국 스프링 유저 모임)에서나 볼 수 있던 라이브코딩이네요!
예전에 플래시캠프서울 행사에서 보던 플래시 아트를 주제로 했는데요. 그때에도 매우 멋있다고 생각했었는데, 이런 짓(?)을 하시는 분이 국내에도 계셨군요!
하지만, 확실히 국내에서의 돈이 되는 플래시는 아니기때문에-_- 취미로 하고 계시다고 하네요.

일단 아무것도 없는 상태에서 라이브코딩으로 모든 것을 진행했습니다. Flash에다가 아무것도 draw하지 않고, 오직 ActionScript로만 코드를 작성했습니다.
그랬는데, 매우 아름다운 영상이 나왔네요. 중간에 라이브코딩을 해서 오류도 나고 실수도 좀 했지만(신기한 건 진짜 아무것도 준비를 해오지 않고 온 듯한 느낌을 좀 받았음 ㄷㄷ), 결국에는 멋진 아트웍을 한시간안에 만들어버렸네요~ 와 이거 참 재미있네요~ 저도 나중에 시간나면 해봐야겠어요!

공씨님은 발표도 참 잘하시고, 코딩도 참 잘하시네요! 부럽 ㅠㅠ
그 만든 코드를 좀 보고 싶은데....카페에 올라오려나.....


3. Flash CS5 for iPhone - 우야꼬님

애플의 변경된 정책과 어도비에서 포기로 인해 발표안할 줄 알았는데, 그냥 했네요~^^
확실히 Flash로 아이폰앱을 개발하게 된다면 그래픽그리고, 모션을 하는 부분에 대해서는 매우 쉽게 개발할 수 있겠지요^^ 하지만, 제 생각은 조금 틀렸던 것이.... 실제로 애플에서 제공하는 것은 Objective-C를 통한 개발인데, 그걸 Flash로 개발해서 억지로 iPhone에 맞게 변형해서 끼워맞춘다는 것 자체가 깔끔하지도 못하고 한번의 변환과정을 거치는 것이라 퍼포먼스, 호환성 등에 뭔가 문제가 생길 것이라는 생각이 조쿰 들었습니다.
그래서 좀 원하지 않았는데, 그래도 어도비에서 포기했다니 다행이네요-_- 이런건 시작하지 말았어야....-_-

어쨌든, 저번에 Flash Camp Seoul행사에서도 cs5를 이용한 아이폰개발을 보여주었는데요. 참 신기하긴 합니다. 뭐 안드로이드로 퍼블리싱이 가능하게 한다고 합니다. 확실히 플래시로 개발하게 되는 장점은 그것이네요. 그래픽에서 매우 자유롭죠. 웹에서도 항상 html + css + js환경에선 그리는 것에 대해서 한계가 있었고, 그걸 플래시가 보완해주는 형태였는데, 안드로이드에서도 그래픽을 그리기위해선 매우 큰 고통이 필요합니다-_- 그걸 쉽게 해주는 것은 확실히 플래시가 좋긴 합니다.
하지만, 어플형태로 제작하게 된다면..플래시로 개발하면 안되겠죠-_-
안드로이드도 나름 컴포넌트가 잘 되어있어서 개발을 빠르게 할 수 있죠.

어쨌든, 우야꼬님이 마지막에 좋은 얘기를 해주셨는데요. 원하는 걸 만들고 싶으면 그냥 계속 삽질하라는....(제 귀에는 그냥 이렇게 들리네요-_-)



4. 플래시 플랫폼으로 표현하는 SNS - 러브데브님

오창훈님이신데, 예전에 Daum DevDay때보고 1년만에 뵙는군요^^
암튼, 네이버에서도 하고 있는 OpenSocial을 얘기하러 나오신 것 같습니다. 확실히 Facebook에서 하고 있는 소셜게임이 외국에서는 굉장히 인기가 있는 것이 사실입니다. 하지만, 아직 국내에서는 Facebook만큼의 인맥이 구축된 인터넷서비스는 싸이월드 뿐인데, 싸이월드에서 그나마 소셜게임이 조금 선전을 하고 있죠~ 하지만, 아직 도토리 현질(?)수준이 아직은 많이 미약한 듯.
러브데브님 말대로 시장은 계속 커질 것이라는 기대가 조금 있긴하네요. 일단 싸이월드는 컴퓨터를 잘 모르는 사람들도 많이 하니깐요. 지금 싸이월드 소셜앱설치수가 많은 건 80만명까지 되는 걸보니.....-_-

일단 하고 싶은 얘기는 소셜앱을 만드는데에는 최적의 플랫폼이 플래시라는 것입니다. 저도 물론 그렇게 생각하구요. 아직까지 국내나 외국에서 ie점유율이 이렇게 높은데, html + js + css조합으로는 표현의 한계가 있게 되죠. 그래서 대부분의 소셜게임은 플래시로 제작이 되어있구요.
제가 생각하는 것과 많이 비슷하네요. 저도 플래시는 깔끔하게 swf파일 하나로 내려지기때문에-_-(의외로 깔끔한 걸 좋아한다는ㅜㅜ), 그리고 크로스플랫폼에 대한 개발이 편하기 때문에 등등~

그리고 마지막에 me2day를 이용한 오픈소셜을 소개시켜주셨네요. 예전에 네이버도 오픈소셜에 참여한다고 들었는데, 미투데이로 하는 것이네요. 미투데이는 아직 싸이월드만큼 인맥구축은 없지만, 이제 계속 성장하고 있는 서비스라서 소셜앱을 제작하면 많이 할 것 같습니다. 국내에서도 킬러앱수준의 소셜게임이 얼른 나왔으면 하네요^^

5. ??? - ???

아젠다에는 자수님으로 되어있는데... sk컴즈에서 일하시는 분 같은데, 검색위젯, 싸이월드 뮤직스킨에 대해서 발표를 하셨네요.
아....이때 친구가 와서 옆에서 기아와 롯데전을 시청하느라... 제대로 발표를 못들었어요.....ㅠㅠㅠㅠㅠ


오늘 발표는 참 재미있었네요~ 제가 좋아하는 플래시얘기만 잔뜩 들을 수 있는 기회였으니까요^^
최근 개발자들 사이에선 플래시가 참 많이 언급이 되었지요. 스티브잡스가 매우 까서....-_- 그래도 플래시는 참 좋은 기술인 것 같습니다.

PS. 스티브잡스는 언제까지 플래시를 깔것인가.....하긴 Adobe가 게으른건 사실이야-_-
 
Posted by 머드초보

댓글을 달아 주세요

 
문제가 된다면 삭제하겠습니다-_-

전에 WireShark를 이용해서 알송패킷을 캡쳐했을 때 보면 특정주소의 WebService를 요청해서 가져오게 되어있었습니다. http://mudchobo.tomeii.com/tt/434

실제 전송하는 데이터는 MD5값인데, 이게 어떻게 생성되는지 몰라서 구글에서 검색을 하니 어떤 블로그에서 시도한 흔적을 발견했습니다. 거기에 있는 댓글에서 발견했습니다^^
http://dialup.egloos.com/152001

"MP3 파일의 경우 strChecksum 값은 ID3태그등을 제외한 순수 MP3 음악 데이터를 앞에서부터 163840 바이트 읽어서 MD5로 돌린 값입니다. " 라고 친절하게 답변이....-_-

그래서 이렇게 하니까 잘 되더라구요. 아래는 샘플 코드입니다.
필요한 라이브러리는 MD5생성해주는 corelib가 필요합니다.
http://code.google.com/p/as3corelib/
[code]<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    applicationComplete="applicationCompleteHandler()">
    <mx:Script>
        <![CDATA[
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import flash.text.engine.ContentElement;
            import mx.messaging.messages.HTTPRequestMessage;
            import mx.rpc.http.HTTPService;
            import com.adobe.crypto.MD5;
            private function applicationCompleteHandler():void
            {
                var fs:FileStream = new FileStream();
                fs.open(new File("C:/Users/mudchobo/Downloads/임재범 - 사랑이라서.mp3"), FileMode.READ);
                var fileSize:int = fs.bytesAvailable;
               
                for (var i:int = 0; i < 500000; i++)
                {
                    if (fs.bytesAvailable >= 3 && fs.readUTFBytes(3) == "ID3")
                    {
                        var sizeByte:ByteArray = new ByteArray();
                       
                        // ID3v2길이구하기
                        fs.position += 3;
                        fs.readBytes(sizeByte, 0, 4);
                        var id3Size:int = sizeByte[0] << 21 | sizeByte[1] << 14 | sizeByte[2] << 7 | sizeByte[3];
                        fs.position = id3Size + 10;
                        break;
                    }
                }
               
                // ID3태그 없는 경우
                if (i == 500000)
                {
                    fs.position = 0;
                }
               
                // 공백있는 ID3태그에 대한 처리
                for (i = 0; i < 50000; i++)
                {
                    if (fs.readUnsignedByte() == 255)
                    {
                        var a:int = fs.readUnsignedByte();
                        if ((a >> 5) == 7)
                        {
                            fs.position += -2;
                            break;
                        }
                    }
                }
               
                // 163840만큼 읽어서 md5생성
                var data:ByteArray = new ByteArray();
                fs.readBytes(data, 0, 163840);
                var md5:String = MD5.hashBytes(data);
               
                // 웹서비스 요청
                var httpService:HTTPService = new HTTPService();
                httpService.method = HTTPRequestMessage.POST_METHOD;
                httpService.contentType = "application/soap+xml";
                httpService.url = "http://lyrics.alsong.co.kr/alsongwebservice/service1.asmx";
                httpService.request = new XML('<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="ALSongWebServer/Service1Soap" xmlns:ns1="ALSongWebServer" xmlns:ns3="ALSongWebServer/Service1Soap12"><SOAP-ENV:Body><ns1:GetLyric5><ns1:stQuery><ns1:strChecksum>' + md5 + '</ns1:strChecksum><ns1:strVersion>2.0 beta2</ns1:strVersion><ns1:strMACAddress>ffffffffffff</ns1:strMACAddress><ns1:strIPAddress>255.255.255.0</ns1:strIPAddress></ns1:stQuery></ns1:GetLyric5></SOAP-ENV:Body></SOAP-ENV:Envelope>');
                httpService.addEventListener(ResultEvent.RESULT, resultHandler);
                httpService.addEventListener(FaultEvent.FAULT, faultHandler);
                httpService.send();
            }
           
            private function resultHandler(event:ResultEvent):void
            {
                trace("싱크가사 = " + event.result.Envelope.Body.GetLyric5Response.GetLyric5Result.strLyric);
            }
           
            private function faultHandler(event:FaultEvent):void
            {
                trace(event.toString());
            }
           
        ]]>
    </mx:Script>
</mx:WindowedApplication>
[/code]
여기서 알송가사에서 제공하는 웹서비스는 WebService인데, HTTPService로 요청한 이유는 wsdl문서가 어디있는지 못찾겠음 ㄷㄷ 그래서 그냥 httpservice로 xml통채로 넘겨버리니-_- 되더라구요 ^^
xml넘길 때 strCheckSum값만 md5구한걸로 넘기면 돼요^^

[code]싱크가사 = [00:00.00]하루 하루 그대만 보여서<br>[00:23.28]매일매일 눈을 가리고 살아<br>[00:31.34]그대 곁을 나조차도 모르게 머물며<br>[00:38.91]메마른 내 가슴이 그댈 잊어버리지 못한 이유는<br>[00:00.00]<br>[00:00.00]<br>[00:49.93]사랑이라서 사랑이라서<br>[00:56.06]두번다시 못볼 사랑이라서<br>[00:00.00]<br>[01:03.32]하늘이 하는 일 돌릴 수 없는 일<br>[01:11.39]이렇게 사는게 힘들면 그녈 보내줄텐데<br>[01:19.51]죽어서 보라고 그래서 보라고<br>[01:26.42]그때라도 사랑한 마음이 남아있게된다면<br>[01:34.53]그때쯤에<br>[00:00.00]<br>[01:42.93]어딜가도 그대만 보여서<br>[01:49.88]매일매일 나를 지우고 살아<br>[01:57.28]한순간도 바람처럼 떠날줄 모르고<br>[02:04.71]죽어도 내가슴이 그댈 떠나보내지 못한 이유는<br>[00:00.00]<br>[02:15.49]사랑이라서 사랑이라서<br>[02:23.68]가슴가득 맺힌 사랑이라서<br>[00:00.00]<br>[02:29.68]하늘이 하는 일 돌릴 수 없는 일<br>[02:37.81]이렇게 사는게 힘들면 그녈 보내줄텐데<br>[02:45.79]죽어서 보라고 그래서 보라고<br>[02:52.51]그때라도 사랑한 마음이 남아있게 된다면<br>[03:00.90]그때쯤에<br>[00:00.00]<br>[03:04.66]간절히 바랬어 너에게 가는일<br>[00:00.00]<br>[03:33.19]하늘이 하는 일 돌릴 수 없는 일<br>[03:41.80]이렇게 사는게 힘들면 그녈 보내줄텐데<br>[03:49.23]죽어서 보라고 그래서 보라고<br>[03:56.56]그때라도 사랑한 마음이 남아있게된다면<br>[04:04.29]그때쯤에<br>[/code]

PS. HTTPService에서 xml전송해서 하는 거 어떻게 하는지 몰랐는데, 그냥 httpservice에 있는 request객체에 xml을 생성해서 넣어주면 된다는....-_-

 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 쿠나 2010.01.17 16:27  댓글주소  수정/삭제  댓글쓰기

    우와~ 감사합니다 :)
    POST 헤더를 어떻게 만들어서 보내야하는지 전전긍긍했는데 도움 많이 되었어요~

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

      아....도움이 되셨다니 다행이네요^^
      근데 이글은 알송가사서버에 비정상접속에 대한 글에서....얻으셨다니!-_-

  2. plz 2010.05.31 00:46  댓글주소  수정/삭제  댓글쓰기

    죄송한데 이걸 C++로 바꿔주시면 안될까요

  3. 궁금이 2010.07.24 05:09  댓글주소  수정/삭제  댓글쓰기

    for (i = 0; i < 50000; i++)
    {
    if (fs.readUnsignedByte() == 255)
    {
    var a:int = fs.readUnsignedByte();
    if ((a >> 5) == 7) //굳이 5와 7로 값을 정한이유가 왜죠?
    {
    fs.position += -2; //포지션이 두칸뒤로가면 계속 돌지않나요?
    break;
    }
    }
    }

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

      헐....저도 기억이....나질 않네요-_-
      몬가 ID3값에 공백이 있어서 몬가 처리해놓은 것 같은데....-_-

  4. tri**** 2010.11.03 09:32  댓글주소  수정/삭제  댓글쓰기

    정말 배울게 많은 곳이에요~

    Flex 공부하면서 많이 보고갑니다.

  5. Dect 2012.01.08 16:37  댓글주소  수정/삭제  댓글쓰기

    꼭 ID3를 보내야하나요?
    그냥 HTTP만 보내도 될듯한데..

  6. Dect 2012.01.11 20:23  댓글주소  수정/삭제  댓글쓰기

    죄송합니다. 한가지만 더 여쭙겠습니다..;

    SetFilePointer fh, ExistSize, 0, FILE_BEGIN
    ReadFile fh, Buff(0), 163840, 0, ByVal 0

    ExistSize 로 헤더의 크기를 구한다음
    그 헤더의 끝. 그러니까 순수 음악데이터를 가져온후
    163840 까지 읽어 들였습니다. 그러고 ByteHash 를 돌려
    값을 구했는데요.. 자꾸 딴 값이 나옵니다.ㅠㅠ

    JavaScript는 아니지만 원리를 도저히 모르겠습니다.. ( MD5에서 3일째.. )

    MD5가 다른건가요? 아니면
    저 가져오는 소스가 잘못된건가요?

  7. BlogIcon 토리;s 2012.02.18 06:35  댓글주소  수정/삭제  댓글쓰기

    전 빌더를 안써서 ..httpService 가없다는 비극이!

  8. BlogIcon 토리&#039;s 2012.05.21 20:23  댓글주소  수정/삭제  댓글쓰기

    SOAP 요청부가 바뀐듯한데...전..분석해도 모르겟네요ㅜ

  9. BlogIcon 토리&#039;s 2012.05.22 01:21  댓글주소  수정/삭제  댓글쓰기

    아. 그리고 wsdl 은
    http://lyrics.alsong.co.kr/alsongwebservice/service1.asmx?wsdl
    요깁니당.

  10. BlogIcon 혁이s 2013.02.28 14:31  댓글주소  수정/삭제  댓글쓰기

    혹시 웹에서도 가수+노래제목 으로 가사데이터를 가져올수 잇나요?

 
htmlText에서 <a>태그를 사용할 수 있는데요. 이것에 마우스오버 시 다른 css로 바꾸는 a:link, a:hover, a:active 스타일을 적용할 수 있습니다.
근데, 그냥 css에 때려박으니까 안되더라구요. 검색하니까 바로 나오네요^^

우선 StyleLabel.as
[code]
package
{
    import flash.text.StyleSheet;
   
    import mx.controls.Label;
   
    public class StyleLabel extends Label
    {
        public function StyleLabel()
        {
            super();
        }
       
        override protected function createChildren():void
        {
            super.createChildren();
           
            var styleSheet:StyleSheet = new StyleSheet();
            styleSheet.setStyle("a:link", {color:"#004F99", textDecoration:"none"});
            styleSheet.setStyle("a:hover", {color:"#004F99", textDecoration:"underline"});
            styleSheet.setStyle("a:active", {textDecoration:"none"});
            textField.styleSheet = styleSheet;   
        }
    }
}
[/code]
textField에 styleSheet라는 것이 있는데, StyleSheet를 생성해서 a:link, a:hover, a:active를 스타일설정해서 textField에 있는 styleSheet에 넣어주면 끝!

[code]<local:StyleLabel id="styleLabel">
        <local:htmlText>
            <![CDATA[<a href="http://www.naver.com">네이년</a>]]>
        </local:htmlText>
    </local:StyleLabel>[/code]
htmlText를 사용하는 컴포넌트 Label이나 Text, TextArea에서 됩니다.
 
Posted by 머드초보

댓글을 달아 주세요