一般的设备都是有摄像头的,人人都是摄影师。
如果你创建一个应用程序,来使用创建图片,你可以通过一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);