2012-04-13 5 views
-1

Gibt es eine Möglichkeit, wie Sie mit as3 auf die iPad-Kamera zugreifen können?as3 Adobe Air Access iPad-Gerätekamera

  • meine ich die Kamera in der App starten selbst
  • haben die Fähigkeit, ein Shooting nehmen und das Bild zu byteArray speichern und das Bild auf dem Hintergrund der Anwendung oder eine Manipulation

Ich habe dabei einige getan Forschung die meisten von ihnen zeigen nur, wie man auf die Android-Geräte zugreifen. Danke für jeden Vorschlag oder Hilfe.

+1

Überprüfen Sie auch diese https://twitter.com/#!/inspirit/status/189618267743195136 –

+0

schön, ich werde es suchen – Bruce

+1

Ich verstehe meine Frage vielleicht zu Board, aber ich habe die Antwort bekommen. Lustig ist, dass die Person, die diese Frage schließt, überhaupt nicht von AS3 weiß ... – Bruce

Antwort

7

Ja, Sie können das absolut tun. Das Schöne an Flash ist, dass der Code, den Sie verwenden, derselbe ist, den Sie auf Android oder einem PC verwenden würden.

wahrsten Sinne des Wortes, können Sie dies tun, um die Kamera an einen Video-Objekt zu verbinden:

var camera:Camera = Camera.getCamera(); 
var video=new Video(); 
video.attachCamera(camera); 
this.addChild(video); // 'this' would be a Sprite or UIComponent, etc... 

Es gibt viel mehr zu tun ist, wenn Sie etwas Nützliches tun wollen, aber es ist ziemlich einfach, wenn Sie beginnen:)

+0

Funktioniert das für iOS? – Bruce

+0

Ähm, JA. Das ist, was ich kommunizieren wollte :) Es funktioniert auf jedem iOS-Gerät (ich habe es auf dem iPhone 3GS zu 4S verwendet, und Ipad und Ipad2 - nicht die neuesten Ipad, aber ich kann nicht sehen, warum es anders sein würde. Works mit beiden Kameras vorne/hinten (auf Geräten, die beide haben). –

+0

ich versuche es Kumpel. Danke für die Hilfe. ADOBE AIR RIASE – Bruce

0

XpenseIt Beispielcode bietet diese Kamera Implementierung:

Klasse: CameraUtil:

package utils 
{ 
    import events.CameraEvent; 

    import flash.display.BitmapData; 
    import flash.display.Loader; 
    import flash.display.LoaderInfo; 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 
    import flash.events.MediaEvent; 
    import flash.filesystem.File; 
    import flash.filesystem.FileMode; 
    import flash.filesystem.FileStream; 
    import flash.media.CameraRoll; 
    import flash.media.CameraUI; 
    import flash.media.MediaPromise; 
    import flash.media.MediaType; 
    import flash.utils.ByteArray; 

    import mx.events.DynamicEvent; 
    import mx.graphics.codec.JPEGEncoder; 

    [Event(name = "fileReady", type = "events.CameraEvent")] 
    public class CameraUtil extends EventDispatcher 
    { 
     protected var camera:CameraUI; 
     protected var loader:Loader; 
     public var file:File; 

     public function CameraUtil() 
     { 
      if (CameraUI.isSupported) 
      { 
       camera = new CameraUI(); 
       camera.addEventListener(MediaEvent.COMPLETE, mediaEventComplete); 
      } 
     } 

     public function takePicture():void 
     { 
      if (camera) 
       camera.launch(MediaType.IMAGE); 
     } 

     protected function mediaEventComplete(event:MediaEvent):void 
     { 
      var mediaPromise:MediaPromise = event.data; 
      if (mediaPromise.file == null) 
      { 
       // For iOS we need to load with a Loader first 
       loader = new Loader(); 
       loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleted); 
       loader.loadFilePromise(mediaPromise); 
       return; 
      } 
      else 
      { 
       // Android we can just dispatch the event that it's complete 
       file = new File(mediaPromise.file.url); 
       dispatchEvent(new CameraEvent(CameraEvent.FILE_READY, file)); 
      } 
     } 

     protected function loaderCompleted(event:Event):void 
     { 
      var loaderInfo:LoaderInfo = event.target as LoaderInfo; 
      if (CameraRoll.supportsAddBitmapData) 
      { 
       var bitmapData:BitmapData = new BitmapData(loaderInfo.width, loaderInfo.height); 
       bitmapData.draw(loaderInfo.loader); 
       file = File.applicationStorageDirectory.resolvePath("receipt" + new Date().time + ".jpg"); 
       var stream:FileStream = new FileStream() 
       stream.open(file, FileMode.WRITE); 
       var j:JPEGEncoder = new JPEGEncoder(); 
       var bytes:ByteArray = j.encode(bitmapData); 
       stream.writeBytes(bytes, 0, bytes.bytesAvailable); 
       stream.close(); 
       trace(file.url); 
       dispatchEvent(new CameraEvent(CameraEvent.FILE_READY, file)); 
      } 
     } 

    } 
} 
+0

Es sieht in der Tat nützlich – Bruce

+0

könnte Rest der Klasse oder die URL der gesamten Klasse haben? – Bruce

+0

Dies verwendet CameraUI. Was funktioniert gut, aber bekannt ist (wie von Air 3.8), um Kontextverlust in AIR/IOS GPU beschleunigte Anwendungen zu erstellen. Ich empfehle stattdessen den Webcam-Ansatz. – mika

1

bluebill1049, ich bin mir nicht sicher aus dem Thread, wenn Sie bekommen haben, was Sie gesucht haben, aber ich habe Ihre Anfrage für die ganze Klasse gesehen. Ich fand die gleichen Informationen (die Jason Sturges in seiner Antwort geschrieben hat) in diesem Post.

take photo using Adobe Builder (flex) for iOS

Im Gegensatz zu seiner Antwort hier, seine Antwort auf diesen Posten hatte sich auf den Aufbau einer mobilen App einen Link zu einem großen Tutorial und es war aus diesem Tutorial, dass dieser Code wurde aufgehoben/zitiert. Es erfordert eine Event-Klasse (event.CameraEvent - nur ein paar Zeilen), die in diesem Projekt/Tutorial enthalten ist, so dass es wichtig ist, zurück zur Quelle zu gehen, sozusagen. Diese Quelle befindet sich hier:

http://devgirl.org/files/RIAUnleashed/

Mein Dank geht an Jason. Nur damit Sie nicht graben müssen, hier ist die Ereignisklasse, die in dem Zitat fehlt:

package events 
{ 
    import flash.events.Event; 
    import flash.filesystem.File; 

    public class CameraEvent extends Event 
    { 
     public static const FILE_READY:String = "fileReady"; 

     public var file:File; 

     public function CameraEvent(type:String, file:File=null, bubbles:Boolean = true, cancelable:Boolean = true) 
     { 
      super(type, bubbles, cancelable); 
      this.file = file; 
     } 
    } 
} 

Hoffe, dass hilft!

+0

Obwohl ich mein Problem gelöst habe, aber vielen Dank an Sie. Ich werde diese Antwort für jede andere Referenz behalten. Vielen Dank!! (Ich habe so viele negative auf die Frage -_-) – Bruce

1

Die Verwendung des Ladeprogramms ist nicht die einzige Möglichkeit, auf die Bildbytes von iOS zuzugreifen. Es stellt sich heraus, dass die Daten bereits im JPEG-Format vorliegen, daher ist eine erneute Kodierung nicht notwendig.

Tun Sie einfach eine mediaPromise.open(), um an die Bytes zu gelangen und sie stattdessen direkt zu speichern.