爱学习的站长www.mmic.net.cn

www.mmic.net.cn 欢迎学习共同成长
公告信息
www.mmic.net.cn 欢迎学习共同成长
文章分类
文章档案
文章
Adobe Flash Builder 4.5 Android Air 程序开发系列
2011/8/5 15:23:17

一般的设备都是有摄像头的,人人都是摄影师。

如果你创建一个应用程序,来使用创建图片,你可以通过一android api。你也可以获取相册的内容,也叫媒体库,去选择图片和显示图片。你可以添加图片从AIR,你还可以使用AIR来打开摄像头来拍照或者录制视屏。

相册

相册是一个应用程序,用来显示sd卡中的媒体信息。

AIR使用 flash.media.CameaRoll 类来获取相册中的内容。这个在AIR桌面程序是不支持的。

选择一张照片

//是否支持相册

import flash.media.CameraRoll;

if(CameraRoll.supportedBrowseForImage==false)

{

trace("this device does not supported accessto the gallery")

return;

}

//创建实例

private var cameraRoll:CameraRoll=new CameraRoll();

//注册事件

//选中图片照片

cameraRoll.addEventListener(MediaEvent.SELECT,onSelect);

//用户选择opts 

cameraRoll.addEventListener(Event.CANCEL,onCancel);

function onCancel(event:Event):void

{

trace("user left the gallery",event.type);

}

//ErrorEvent.ERROR

cameraRoll.addEventListener(ErrorEvent.ERROR,onError);

function onError(event:Event):void

{

trace("Gallery error",event.type)

}

// 选中图片以后,MediaEvent 对象返回,转换data 属性为MediaPromise 对象,使用Loader来加载图片。

private function init():void 

{

_cameraRoll = new CameraRoll();

_cameraRoll.addEventListener(MediaEvent.SELECT, onSelect);

_cameraRoll.browseForImage();

}

private function onSelect(event:MediaEvent):void

{

var promise:MediaPromise = event.data as MediaPromise;

_loader = new ExifLoader();

_loader.addEventListener(Event.COMPLETE, onImageLoaded);

_loader.load(new URLRequest(promise.file.url));

}

private function onImageLoaded(event:Event):void

{

var exif:ExifInfo = _loader.exif as ExifInfo;

if (exif.thumbnailData) {

var thumbLoader:Loader = new Loader();

thumbLoader.loadBytes(exif.thumbnailData);

addChild(thumbLoader);

}

}

MediaPromise 的概念初次在桌面程序中的拖动中有介绍,当一个对象并不存在是,在AIR我们必须使用引用。他的file 属性包含了,name natviePath 或者是url 的值。

我们发现,只有左上角的部分图片是可以显示的。这是因为摄像头的像素比你的应用程序大的多。

我们修改代码,来使我们拖动图片,这样便可以看到其他的内容。我们将把图片做为一个sprite ,是能被拖动的。

private function onSelect(event:MediaEvent):void

{

var promise:MediaPromise = event.data as MediaPromise;

var loader:Loader = new Loader();

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);

loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);

loader.loadFilePromise(promise);

}

private function onImageLoaded(event:Event):void

{

var container:Sprite = new Sprite();

var image:DisplayObject = event.currentTarget.content as DisplayObject;

container.addChild(image);

addChild(container);

_rectangle = new Rectangle(0, 0, -image.width - stage.stageWidth, -image.height - stage.stageHeight);

container.addEventListener(MouseEvent.MOUSE_DOWN, onDown);

container.addEventListener(MouseEvent.MOUSE_UP, onUp);

}

private function onDown(event:MouseEvent):void

{

event.currentTarget.startDrag(false, _rectangle);

}

private function onUp(event:MouseEvent):void

{

event.currentTarget.stopDrag();

}

需要注意的一点是,browseForImage 方法仅仅是从相册中加载一张图片而已。而不是从文件系统中加载图片而已,即使你的相册已经导航到文件。某些设备会在这种情况下提示你,选择从相册或者是从文件。如果你试图从文件中加载,那么将会抛出错误。这个bug暂时还没有修复,所以你必须监听错误,通知给用户。

cameraRoll.browseForImage();

cameraRoll.addEventListener(ErrorEvent.ERROR,onError);

function onError(event:Event):void

{

if(event.eventID==212)

trace("you can only load images from the gallery")

}

添加一张图片

你可以使用AIR给相册添加一张图片。获得SD卡写数据的权限,你必须事先设置权限,如下:

<user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

supportsAddBitmapData 属性可以验证你的设备是否支持该特性。

import flash.media.CameraRoll;

if(CameraRoll.supportsAddbitmapData==false)

{

trace("You cannot add image to the gallery");

return;

}

如果设备支持这种特性的话,创建一个CameraRll 的实例,监听Event.Complete 事件,调用addBitmapData 方法保存一张图片到相册中。在这个实例里,舞台的外形被保存了到相册中。

这个特性被用于在用户不断刷新时绘制应用程序,在绘制的时候保存,然后再次绘制的时候重新加载。

var cameraRoll:CameraRoll=new CameraRoll();

cameraRoll.addEventListener(ErrorEvent.Error,onError);

cameraRoll.addEventListener(Event.COMPLETE,onComplete);

var bitmapData:BitmapData=new BitmapData(stage.stageWidth,stage.stageHeight);

bitmapData.Draw(stage);

cameraRoll.addBitmapData(bitmapData);

Camera CameraUI

能够使用相机的权限是:

<user-permission android:name="android.permission.CAMERA"/>

CameraUI ActionScript新增加的类,用来支持使用相机的类。

//设备是否支持相机

import flash.media.CameraUI;

if(CameraUI.isSupported==false)

{

trace("you cannot use camera ")

retrun;

}

如果设备支持照相功能,MediaType 来设置照相机的 拍照或者是录像功能。

import flash.media.MediaType;

var cameraUI:CameraUI=new CameraUI();

cameraUI.launch(MediaType.IMAGE);

打开照相机后,程序会在后台运行,所以程序要监听事件。MediaEvent.COMPLETE 事件在照完照片后触发,Eveent.CANCEL 是没有照片时触发,ErrorEvent是在照相过程中产生错误时触发。

cameraUI.addEventListerner(MediaEvent.COMPLETE,onComplete);

cameraUI.addEventListener(Evetn.CANCEL,onCancel);

cameraUI.addEventListener(ErrorEvent.ERROR,onError);

一旦接收到事件,相机会自动关闭,AIR应用程序会从后台调到前台继续运行。

Complete 事件后,与“选择一张图片”相似的处理方式。

private function onComplete(event:MediaEvent):void

{

var promise:MediaPromise = event.data as MediaPromise;

var loader:Loader = new Loader();

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);

loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);

loader.loadFilePromise(promise);

}

private function onImageLoaded(event:Event):void

{

var bitmapData:BitmapData = Bitmap(event.currentTarget.content).bitmapData;

var bitmap:Bitmap = new Bitmap(bitmapData);

// determine the image orientation

var isPortrait:Boolean = (bitmapData.height/bitmapData.width) > 1.0;

// choose smallest value between stage width and height

var forRatio:int = Math.min(stage.stageHeight, stage.stageWidth);

// calculate the scaling ratio to apply to the image

var ratio:Number;

if (isPortrait)

{

ratio = forRatio/bitmapData.width;

}

else

{

ratio = forRatio/bitmapData.height;

}

bitmap.width = bitmapData.width * ratio;

bitmap.height = bitmapData.height * ratio;

if (!isPortrait)

{

bitmap.y = bitmap.width;

bitmap.rotation = -90;

}

addChild(bitmap);

}

}

上传文件到远程服务器

网络的权限:

<uses-permission android:name="android.permission.INTERNET">

上传的功能和桌面应用的一样:

引自:ic pdf http://pdflist.mmic.net.cn

import flash.net.URLRequestMethod;

import flash.filesystem.File;

var request:URLRequest=new URLRequest("server url");

request.method=URLRequestMethod.POST;

var uploadFile:File=new File(promise.file.url);

uploadFile.upload(requext);

新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"
 技术   浏览(3312)   评论(0)   关键字
  
Copyright © 2010-2020 power by CYQ.Blog - 秋色园 v2.0 All Rights Reserved