Flickr Flash 連携 vol3 〜Flashへ写真の読み込み〜
SINAPの柿内です。
この連載では写真共有サイトFlickrのAPIを使い、FlickrとFlashを連携させて、FlashへFlickrの画像を読み込んだり、Flashから写真をアップする様なアプリケーションを作る方法をご紹介ています。
前回はFlickr APIへブラウザを使って接続してみました。今回は実際にFlashから接続して、写真をFlashに取り込んでみましょう。
テスト用のFLAファイルの作成
今回はAdobe Flashを使ってオーサリングしていきます。まずは何もオブジェクトを持たないファイルを作り、その中に写真読み込み用の空のムービークリップを作成します。空のムービークリップのインスタンス名を"PhotoCont"としてください。PhotoContに写真を1枚読み込みます。
写真の一覧を取得
前回はブラウザから自分のIDで公開されている写真の一覧を取得しました。
公開している写真を検索するメソッドは
flickr.photos.search
です。このメソッドのオプションでユーザーIDを指定する事ができますので、自分のユーザーIDを指定します。リクエストのパラメーターをまとめると次のようになります。
method : flickr.photos.search
api_key : あなたのapi_key(仮に1234f56cdalとします)
?user_id : あなたのNSID(仮に12345678@N00とします)
privacy_filter : 写真の公開設定。ここでは公開した写真を読み込みたいので1とします
GETに上記のパラメーターを埋め込んだリクエスト:
method=flickr.photos.search&api_key=1234f56cdal&user_id=12345678@N00&privacy_filter=1;
このリクエストに対するFlickrからのレスポンスは下記のようなXMLになります。
<rsp stat="ok"> <photos page="1" pages="1" perpage="100" total="2"> <photo id="3662624132" owner="39846669@N02" secret="4f51488d1e" server="3385" farm="4" title="ポスター" ispublic="1" isfriend="0" isfamily="0"/> <photo id="3662622568" owner="39846669@N02" secret="82df43f234" server="2470" farm="3" title="チョコ" ispublic="1" isfriend="0" isfamily="0"/> </photos> </rsp>
ではFlashからそのXMLを読み込んでみましょう
import flash.net.URLRequest; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.events.Event; import flash.events.IOErrorEvent; //NSID、api_keyを格納 var user_id:String = "12345678@N00"; var api_key:String = "1234f56cdal"; //返り値のXMLを格納するXMLオブジェクトを生成 var myXML:XML; //リクエスト用のURLを生成します var url:String = "http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=" + api_key + "&user_id=" + user_id +"&privacy_filter=1"; var myURLReq:URLRequest = new URLRequest(url); //リクエスト発行します var myXMLLoader:URLLoader = new URLLoader(); myXMLLoader.dataFormat = URLLoaderDataFormat.TEXT; myXMLLoader.addEventListener(Event.COMPLETE,setPhotoXML); myXMLLoader.addEventListener(IOErrorEvent.IO_ERROR,isError); myXMLLoader.load(myURLReq); function setPhotoXML(e:Event):void{ //読み込んだ後の処理を記述 myXML = new XML(myXMLLoader.data); } function isError(e:IOErrorEvent):void{ trace("failed to Load photos info"); }
上記のコードで正常に写真の一覧を読み込めれば、"setPhotoXML"が実行され
myXMLに写真の一覧情報がxmlとして代入されます。
写真をロードする
さて読み込んだflickrから写真一覧を読み込むことは成功しましたが、取得できたのは写真の属性情報であり、写真本体のデータではありません。
写真本体のダータを外部から読み込む為のURLがflickrでは用意されています。
これは写真の一覧情報には含まれないので、写真の情報から自分で生成する必要があります。
下記がそのフォーマットです。
http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}_[mstb].jpg
farm_id:photoノードの中のfarm属性がはいります
server-id:photoノードの中のserver属性がはいります
id:photoノードの中のid属性がはいります
secret:photoノードの中のsecret属性がはいります
mstb:写真の大きさを選びます。例)小さいサイズの写真はm拡張値の前につけます xxx_xxx_m.jpgとなります。
詳細はAPI DOCUMENTのURLsをご覧ください。
たとえば1番目の写真の小さいサイズのURLは
http://farm4.static.flickr.com/3385/3662624132_4f51488d1e_m.jpg
となります。
あとは生成したURLの写真をFlashに読み込み終了です。
それでは1番目の写真を読み込む処理を記述したソースを記述します
import flash.net.URLRequest; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.events.Event; import flash.events.IOErrorEvent; import flash.display.Loader; import flash.display.LoaderInfo; //NSID、api_keyを格納 var user_id:String = "12345678@N00"; var api_key:String = "1234f56cdal" //返り値のXMLを格納するXMLオブジェクトを生成 var myXML:XML; //写真を読み込む為のLoaderを生成 var myLoader:Loader; //リクエスト用のURLを生成します var url:String = "http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=" + api_key + "&user_id=" + user_id +"&privacy_filter=1"; var myURLReq:URLRequest = new URLRequest(url); //リクエスト発行します var myXMLLoader:URLLoader = new URLLoader(); myXMLLoader.dataFormat = URLLoaderDataFormat.TEXT; myXMLLoader.addEventListener(Event.COMPLETE,setPhotoXML); myXMLLoader.addEventListener(IOErrorEvent.IO_ERROR,isError); myXMLLoader.load(myURLReq); function setPhotoXML(e:Event):void{ //読み込んだ後の処理を記述 myXML = new XML(myXMLLoader.data); var photo_id:String = myXML.photos.photo[0].@id; var farm_id:String = myXML.photos.photo[0].@farm; var server_id:String = myXML.photos.photo[0].@server; var secret:String = myXML.photos.photo[0].@secret; var size:String = "m" var photoURL:String = "http://farm" + farm_id + ".static.flickr.com/" + server_id + "/" + photo_id + "_" + secret + "_" + size +".jpg" var photoURLreq:URLRequest = new URLRequest(photoURL); myLoader = new Loader(); myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,setImage); myLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,isError); myLoader.load(photoURLreq); } function setImage(e:Event){ var myCont:MovieClip = this.PhotoCont; var myImage:Bitmap = e.target.content; myCont.addChild(myImage); //ステージの中心に表示させましょう myCont.x = (this.stage.stageWidth - myCont.width)/2; myCont.y = (this.stage.stageHeight - myCont.height)/2; } function isError(e:IOErrorEvent):void{ trace("failed to Load photos info"); }
どうでしたか、ステージに写真が表示されましたか?
いままで、写真をデータベースに保存しFlashで表示させるには、どうしてもサーバーサイドのプログラミングが必須でした。しかしFlickr APIを利用すればこれがFlashの開発だけでできてしましいます。
次回はFlickrを使った簡単なスライドショーを作成していきます。
→今回のFlaファイルです。
ダウンロードして制作の参考にしてください。