Skip to main content

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.

Comments

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
Anonymous said…
Luc,

Please help.

Do you have a step by step tutorial on how to take a picture and attach it to an email.

If you do, could you please share with us.

Thank you,
Brian
ravi teja Y said…
Very nice post....
Have one doubt for attaching the image from temporary directory, you have hard coded the image name as Pic.jpg How do you know your phone stores the image with that name? I mean how to get the dynamic image name into the code? Is there any control in saving the image with the custom name.
looking for your answer.
Thanks
Ravi said…
Very nice post....
Have one doubt for attaching the image from temporary directory, you have hard coded the image name as Pic.jpg How do you know your phone stores the image with that name? I mean how to get the dynamic image name into the code? Is there any control in saving the image with the custom name.
looking for your answer.
Thanks

Popular posts from this blog

ADF 12.1.3 : Implementing Default Table Filter Values

In one of my projects I ran into a requirement where the end user needs to be presented with default values in the table filters. This sounds like it is a common requirement, which is easy to implement. However it proved to be not so common, as it is not in the documentation nor are there any Blogpost to be found that talk about this feature. In this blogpost I describe how to implement this.

The Use Case Explained
Users of the application would typically enter today's date in a table filter in order to get all data that is valid for today. They do this each and every time. In order to facilitate them I want to have the table filter pre-filled with today's date (at the moment of writing July 31st 2015).


So whenever the page is displayed, it should display 'today' in the table filter and execute the query accordingly. The problem is to get the value in the filter without the user typing it. Lets first take a look at how the ADF Search and Filters are implemented by the f…

ADF 12.2.x : Conditional Showing Message Instead of List of Values Popup

Today I had to fix an issue in one of our ADF applications. For those of you working with ADF (as I do too occasionally) this might be valuable, so I decided to share this. The application is based on an old Oracle Forms applications and I had to implement the following functionality:

FRM-41830 : List of Values contains no entries.

In other words (more ADF like) : If you are about to render a List of Values and that List of Values contains no rows, just show a message instead of showing the List of Values.

In this post I will describe how I was able to implement this although it turned out to be a challenge.
Below are the steps that I took. Note that the Application can be downloaded from GIT.

1) I use a UI pattern where we use readonly table and do edits in a popup. That means that any List of Values will add an additional popup to the UI.



2) The List of Values that I use in this sample only shows entries where the minimum salary is less then the employees current salary. Not that …

ADF 11g Quicky 3 : Adding Error, Info and Warning messages

How can we add a message programatically ? Last week I got this question for the second time in a months time. I decided to write a short blogpost on how this works.

Adding messages is very easy, you just need to know how it works.
You can add a message to your faces context by creating a new FacesMessage. Set the severity (ERROR, WARNING, INFO or FATAL ), set the message text, and if nessecary a message detail. The fragment below shows the code for an ERROR message.

1: public void setMessagesErr(ActionEvent actionEvent) {
2: String msg = "This is a message";
3: AdfFacesContext adfFacesContext = null;
4: adfFacesContext = AdfFacesContext.getCurrentInstance();
5: FacesContext ctx = FacesContext.getCurrentInstance();
6: FacesMessage fm =
7: new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, "");
8: ctx.addMessage(null, fm);
9: }


I created a simple page with a couple of buttons to show the result of setting the message. When the butto…