Posts Tagged ‘AIR’

AIR/Flex RegEx Testing Tool

Tuesday, July 13th, 2010

在Flex/AS 3里面使用正则做验证有时候还是比较方便的,要是验证正则表达式是否正确,推荐使用RegEx Testing Tool这个小工具,不仅有验证,还有一些常用的正则表达式写法。
在线的Flex版本地址:http://gskinner.com/RegExr/
AIR的安装地址:http://gskinner.com/RegExr/desktop
AIR文件的下载地址:http://gskinner.com/RegExr/desktop/RegExr.air

ActionScript/Flex 使用 as3flickrlib 访问 Flickr.com 的资源

Friday, January 22nd, 2010

Flickr.com是业内最好、最有名的图片网站,它提供了丰富的API让开发者创建各种应用。Adobe也很早就发布了ActionScript的Library(as3flickrlib)帮助Flex/Flash开发者开发基于Flash的应用。2007年as3flickrlib的托管从Adobe迁移到Google Code中,到本文撰写时候的最后更新是在2008年8月28日,本文的所有示例代码都是基于Subversion中的最后代码(版本r37)。as3flickrlib的代码需要as3corelib的支持,同时也是学习使用as3corelib编写WebService API的好教材。

使用Flickr的API还是先解决认证的问题,Flickr的认证没有采用OAuth但是方式相似,认证过程相对简单一些。这里采用的是Desktop Application的认证流程:

  • 1. 设定认证的权限,在Flickr.com取得一个frob的参数。
  • 2. 根据frob进行签名获取认证的URL,在浏览器中打开由用户进行授权。
  • 3. 完成授权后,使用frob换取认证的token。
  • 声明一个FlickrService的对象

    f = new FlickrService('xxxxxxxxxxxxxxxxx'); #API Key
    f.secret = 'xxxxxxxxxxxxxxxxx'; #API Secret Key

    获取frob,成功后打开授权页面:

    f.addEventListener(FlickrResultEvent.AUTH_GET_FROB, function(e : FlickrResultEvent) : void{
        if(e.success){
    	frob = e.data.frob as String;
    	var auth_url : String = f.getLoginURL(frob, AuthPerm.READ); #申请只读权限
    	avigateToURL(new URLRequest(auth_url), "_blank" ); #打开授权的URL
        }
    });
    f.auth.getFrob();

    授权完成后,frob交换token:

    f.addEventListener(FlickrResultEvent.AUTH_GET_TOKEN, function(e : FlickrResultEvent) : void{
    	if(e.success){
    		var authResult : AuthResult = AuthResult(e.data.auth);
    		f.token = authResult.token;
    		username = authResult.user.username;
    		nsid = authResult.user.nsid;
    	}else{
    		Alert.show('Exchange Token Error');
    	}
    });
    f.auth.getToken(frob);

    认证授权后,就可以使用FlickrService访问用户的资源,包括那些private的数据。下面是使用一些功能的示例:

    //根据email地址搜索用户
    f.addEventListener(FlickrResultEvent.PEOPLE_FIND_BY_EMAIL, function(e : FlickrResultEvent) : void{
      if(e.success == true){
        var user : User = e.data.user;
        Alert.show(user.username, user.nsid);
    }
    f.people.findByEmail('xxxxxxx@gmail.com');
     
    //根据用户名搜索用户
    f.addEventListener(FlickrResultEvent.PEOPLE_FIND_BY_USERNAME, function(e : FlickrResultEvent) : void{
      if(e.success == true){
        var user : User = e.data.user;
        Alert.show(user.username, user.nsid);
      }
    });
    f.people.findByUsername('xxxxxxxxxxx');
     
    //获取一张图片的信息
    f.addEventListener(FlickrResultEvent.PHOTOS_GET_INFO, function(e : FlickrResultEvent) : void{
      if(e.success){
        var photo : Photo = e.data.photo;
        Alert.show(photo.title, photo.dateAdded.toString());
      }
    });
    f.photos.getInfo('xxxxxxx'); //图片ID
     
    //获取用户所有公开的图片
    f.addEventListener(FlickrResultEvent.PEOPLE_GET_PUBLIC_PHOTOS, function(e : FlickrResultEvent) : void{
      if(e.success){
        var s : PagedPhotoList = e.data.photos;
        for each(var p : Photo in s.photos){
          var url : String = 'http://farm' + p.farmId.toString() + '.static.flickr.com/' 
                                   + p.server.toString() + '/' + p.id + '_' + p.secret + '.jpg';
          var thumbnail : String = 'http://farm' + p.farmId.toString() + '.static.flickr.com/' 
                                   + p.server.toString() + '/' + p.id + '_' + p.secret + '_t.jpg';
     
          Alert.show(url, thumbnail);
        }
      }
    });
    f.people.getPublicPhotos('xxxxxx'); //用户ID,既NSID

    要解释的是如何根据数据拼接图片的访问地址,Flickr的官方文档在http://www.flickr.com/services/api/misc.urls.html

    http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}.jpg
    http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}_[mstb].jpg
    http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{o-secret}_o.(jpg|gif|png)

    farm-id、server-id、id、o-secret和sercret在Photo的对象中都有封装,将值带入上面的格式中就可以得到需要的URL。mstb这个值没有封装,第3种格式种的图片类型由Photo的originalFormat属性可以得到。如果需要得到不同大小的图片,可以修改第3种格式中的o参数

    s	75x75 像素
    t	thumbnail,最长的边为100像素
    m	small, 最长的边为200像素
    -	medium, 最长的边为500像素
    b	large, 最长的边为1024像素 (只有原始图片非常大的时候才有这种格式)
    o	图片原始大小

    本文涉及的是只读flickr数据,以后会发一个使用as3flickrlib上传图片的文章。

    Adobe AIR 程序在安装过程中显示机器本地语言

    Monday, November 23rd, 2009

    今天才发现在AIR程序的描述文件中,name和description这两个标签是可以根据不同的语言进行设置的。AIR的安装程序会根据机器本地的语言显示不同的name和description。标签中的语言参考RFC4646标准,下面是使用中文和英文的示例:

        <name>
            <text xml:lang="en">douhua</text>
    	<text xml:lang="zh-Hans">豆花</text>
        </name>
        <description>
    	<text xml:lang="en">A AIR client use many apis.</text>
    	<text xml:lang="zh-Hans">豆花客户端</text>
        </description>

    AIR 2.0 Beta 1发布和更新Flash Builder 4 Beta 2

    Friday, November 20th, 2009

    AIR 2.0 Beta 1和Flash Player 10.1 Beta一起发布了,以前曾经翻译了一篇关于AIR 2.0 计划的功能文章,现在该是通过代码来检验这些计划的功能了。

    更新Flash Builder 4 Beta 2的环境,先将Flash Builder 4安装目录下的SDK文件夹中的4.0版本进行备份,修改名字为4.0_AIR_Beta_1。然后将下载的SDK文件解压到这个目录,覆盖4.0_AIR_Beta_1下的文件。在Flash Builder 4 Beta 2的Preferences->Flash Builder->Installed Flex SDKs 中添加新的SDK。用新的SDK目录新建一个AIR工程,会在描述文件中看到beta的namespace。

    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <application xmlns="http://ns.adobe.com/air/application/2.0beta">

    解析FileFilter中的macType参数

    Sunday, November 8th, 2009

    在Flash/Flex开发上传程序时,都会使用FileReference和FileFilter这两个类。但是FileReference这个类在Mac下取得文件的type参数为null,不能根据这个值来判断文件的类型,在Windows和Linux下是正常的。Mac下只能根据FileReference得filename来判断后缀名,当然这个问题仅限制于开发WEB Application,如果是开发AIR Application,可以使用FileReference得extension参数来处理文件的类型问题,这个参数在Mac下会取得正确的值。

    进一步研究FileFilter发现它存在一个macType得参数,使得FileReference和FileReferenceList这两个类在调用browse方法的时候能够正确的处理Mac下得文件类型。browse的时候对于判断正确的文件类型,不想上面所遇到的type问题。即使不设置这个参数,大多数情况下都正常,所以猜测这个参数可能是Flash Player早期版本遗留下来的。

    只是根据文件的后缀名判断文件类型是非常危险的,但是在没有上传到服务器前,也没有别的办法判断出文件的类型,所以使用type参数的时候要谨慎。

    AIR 2.0 计划的新功能

    Tuesday, November 3rd, 2009

    在flexcoders的邮件列表发现了Christian Cantrell 关于AIR 2.0 计划的新功能的文章,现在就把其中觉得比较重要的评述一下,有些功能可能在最后的2.0版本见不到,这个list还是在变化中。

    • 支持多点触摸和手势。这个功能需要硬件设备的支持,新版的Apple笔记本和Magic Mouse也许可以。
    • 使用系统默认的程序打开文件。这个是跨平台的API,调用的时候无需知道当前的OS是什么系统。
    • 文件下载的确认对话框。这个功能是提高了在Windows和Mac OS平台的安全性,Linux平台没有这个概念。
    • 本地进程。AIR应用将会作为本地进程来运行,同时会有安装工具把air文件编译为exe和dmg等安装文件。
    • Server Sockets支持。可以开发P2P的应用了。
    • Datagram Sockets。增加了UDP支持。
    • Encrypted Sockets。Socket支持TLS/SSL,这样XIFF可以很容易连到Google Talk的服务器上了
    • IPV6的支持。
    • DNS Resolution。可以查询域名的记录,A记录、IPV4和IPV6地址…
    • 设置URLRequest的timeout
    • 本地录制麦克风的声音。
    • 提高AIR程序的执行效率