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

  • 相关阅读:
    GitHub代码阅读神器,你值有拥有!
    SpringBoot项目构建成jar运行后,如何正确读取resource下的文件
    基于SpringBoot-Dubbo的微服务快速开发框架
    基于SpringBoot的Web API快速开发基础框架
    野蛮生长的前端,从杂牌军到正规军
    让Redis突破内存大小的限制
    myeclipse 8.5-10.0 安装 svn 方法
    几秒后刷新页面
    不错的Spring学习笔记(转)
    Spring学习笔记(三)-类扫描的注解
  • 原文地址:https://www.cnblogs.com/csharponworking/p/2129097.html
Copyright © 2020-2023  润新知