Adobe Flash Builder 4.5 Android Air 程序开发系列 之八 照相机


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

如果你创建一个应用程序,来使用创建图片,你可以通过一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">

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

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);


转载:http://www.cnblogs.com/csharponworking/archive/2011/08/05/2129097.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值