Thursday, December 27, 2012

ADF Mobile : Device Interaction API - Pictures, GPS and Email With Attachments

During the AMIS ADF Masterclass I showed how to take a picture from within an ADF Mobile application, attach it to an Email and send that email out to several recipients. To top it of, I even added the GPS coordinates to the subject, so you know where the picture was taken. And all of that with the push of one single button. Sounds complicated ? Well actually it is very simple.

There are two ways to interact with device services. One is by using the page Definition, the second is by using the API.I decided not to use the pageDef, but to invoke the device datacontrol from java by using the API. Then it is also possible to invoke multiple actions in one java method. In this case I take a picture, get the coordinates and send an email.

How to take a picture ?
Taking a picture is easy. Just call the getPicture() method, and make sure (for this use case) to set Destination Type to File.
 public String getPicture(){  
   //destinationType = 1 so that the image is returned as a filename      
   String theImage = DeviceManagerFactory.getDeviceManager().getPicture(  
            100  
           ,DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URI  
           ,DeviceManager.CAMERA_SOURCETYPE_CAMERA  
           , false  
           ,DeviceManager.CAMERA_ENCODINGTYPE_PNG  
           ,0  
           ,0);  
   return theImage;  
   }  

That takes care of taking the picture.

How to get the current coordinates ?
By invoking getCurrentPosition it is very easy to get the GPS coordinates. Simply call the getCurrentPosition() method, and you will get the current coordinates. The coordinates are refreshed every 60 seconds.
 public Location getPosition(){  
   Location currentPosition = DeviceManagerFactory.getDeviceManager().getCurrentPosition(  
                                    60000  
                                   , true);  
   return currentPosition;  
 }  


How to send an email ?
First take a look at the signature of the sendEmail() method. This immediately makes clear how to proceed from here...
 DeviceManagerFactory.getDeviceManager().sendEmail(  
         java.lang.String to  
         ,java.lang.String cc  
         ,java.lang.String subject  
         ,java.lang.String body  
         ,java.lang.String bcc  
         ,java.lang.String attachments  
         ,java.lang.String mimeTypes)  

The signature explains how it works. All that is needed are Strings. If you want to use multiple recipients, you need to separate them by comma's. The final question is: "how to attach the image that was just created ?".

Attaching the image.
You can do two things. Either use the String that is returned by calling getPicture(), or directly attach the file from the Temporary Directory which I do in this case.
 public void sendEmail(String attachment, Location here){  
   String directoryPathRoot = AdfmfJavaUtilities.getDirectoryPathRoot(0); //TemporaryDirectory  
   String content = "Amis wishes you all the best for 2013. This email contains an image as attachment. ";  
       content = content + "The picture was taken at: latitude=" + here.getLatitude() +  
            ", longitude=" + here.getLongitude();  
   attachment = directoryPathRoot+"/Pic.png";  
   DeviceManagerFactory.getDeviceManager().sendEmail("my.mail@company.org"  
                            , null  
                            , "Merry Xmas and a Happy new year"  
                            , content  
                            , bcc  
                            , attachment  
                            , "image/jpg");  

The content and bcc in the above code sample are Strings that can be set in the method.

Putting it all together
The only thing you need is a button to invoke a method in the bean.
 amx:commandButton text="Take Picture" id="cb3"  
                actionListener="#{pageFlowScope.interactionBean.executeLogic}"  

The method executeLogic() does the magic by invoking all three methods described above.
 public void executeLogic(ActionEvent actionEvent) {  
   String att = getPicture();    
   Location whereAmI = getPosition();  
   sendEmail(att, whereAmI);  
   }  


Push the button, the camera is invoked, and after that, the email client is invoked, showing an email with the attachment, the content (including GPS coordinates) and the recipients.

1 comment:

Anonymous said...

I know this web page provides quality based
posts and extra information, is there any other site which offers
such information in quality?

Feel free to visit my web site; Jual GPS Tracker