zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    php多态
    ssl certificate problem: self signed certificate in certificate chain
    test plugin
    open specific port on ubuntu
    junit vs testng
    jersey rest service
    toast master
    use curl to test java webservice
    update folder access
    elk
  • 原文地址:https://www.cnblogs.com/csharponworking/p/2129097.html
Copyright © 2011-2022 走看看