Wednesday, November 24, 2010

Upload Image from Camera in Mobile Adobe AIR Android

For some reason I really struggled to upload a File (bytes) that I had in memory. It's easy to upload with the FileReference class, but that has an order of what methods can be called dependent on the browse() method being called. In this case, I have an Android <s:MobileApplication> app that uses the CameraUI class to take a picture and upload.

The key is taking the File that is returned, reading the bytes, and using a 3rd party library called MultipartURLLoader (which URLLoader can't do) to upload it.


private var myCam:CameraUI;
private var pictureFromCamera:File;
private var myByteArray:ByteArray;



/** This method you're used to seeing. The handler for when a user takes a picture */
protected function creationCompleteHandler(event:FlexEvent):void
{
      if (CameraUI.isSupported)
{
myCam = new CameraUI();
myCam.addEventListener(MediaEvent.COMPLETE, onPictureTakenComplete, false, 0, true);
}
}


/**
 * Handler for when user closes camera with a picture. MediaEvent (AIR only).
 */
private function onPictureTakenComplete(evt:MediaEvent):void
{
myByteArray = new ByteArray();
pictureFromCamera = evt.data.file;
//load file into bytes
var myFileStream:FileStream = new FileStream();
myFileStream.open(pictureFromCamera, FileMode.READ);
myFileStream.readBytes(myByteArray);
 myFileStream.close();
}


/** method that uploads to server using a 3rd party lib */
public function upload_clickHandler(e:Event):void
{

var ml:MultipartURLLoader = new MultipartURLLoader();
ml.addEventListener(Event.COMPLETE, onUploadComplete, false, 0, true);
//add variables
ml.addVariable('title', titleField.text);
//add file bytes
ml.addFile(myByteArray, pictureFromCamera.name, 'file');
//submit
ml.load('http://justinbieberistheworst.com/upload.do');
}

Monday, November 22, 2010

Alfresco Flex AIR Upload File Basic Authentication Error

See the wiki page for the Alfresco Upload Webscripts, but with these files, I was unable to upload files without always getting the Basic Authentication popup window always appearing. The key was adding the 'alf_ticket' request parameter to the URL string:

fileRef = new FileReference(); //instantiated earlier

urlVars = new URLVariables();
urlVars.title = 'my title';
urlVars.desc = 'my description';

urlReq = new URLRequest();
urlReq.method = URLRequestMethod.POST;
urlReq.data = urlVars;
//ticket was returned after logging in
urlReq.url = "http://<<myserver>>/alfresco/service/site/upload?alf_ticket="+this.ticket;
//
fileRef.upload(urlReq, 'file');

Login code...

var svc : HTTPService = new HTTPService();
svc.resultFormat = 'e4x'
svc.addEventListener(ResultEvent.RESULT, onLogin);
svc.url = "http://<<myserver>>/alfresco/service/api/login";
var params : Object = {};
params.u = 'bsmith';
params.pw = 'password';
svc.send(params);


  protected function onLogin(event:ResultEvent):void
  {
     this.ticket = XML(event.result).text().toString();
  }