Wednesday, August 24, 2011

Android action_send multiple images

Android OS makes it really easy to share an image programmatically, using the ACTION_SEND intent. I had a situation recently, while porting my iBridalGown for iOS app to Android, where I wanted to send an email with multiple image attachments. As with most Android programming tasks, there were first a few snafus to overcome ;) A couple of the problems I was facing were:
  1. ACTION_SEND actually can only handle one image attachment.
  2. The images were saved in the "private" app directory (the one you get when you call getFilesDir()) , which is problematic when attaching images to emails this way.
  3. There are not many clients that respond to ACTION_SEND which can accommodate text/html content and an attachment, let alone multiple attachments
So, what did I do? Three problems, three solutions:
  1. I used the ACTION_SEND_MULTIPLE intent, in order to send multiple attachments.
  2. I made temporary copies of the images in external storage before attaching them to the intent.
  3. I made sure only Gmail would be launched, since it is the only app I found which can reliably handle sending text/html and multiple image attachments.
More details...

Monday, August 22, 2011

Android programmatic density independent pixels

I've been doing a bunch of Android programming lately, working on porting the iBridalGown iOS app to Android, so I've been using a lot of "dip" (density independent pixels) measuring in my layouts. For example, in a TextView, I might specify something like this in XML:

<TextView
      android:id="@+id/headertext"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:minHeight="48dip"
      android:textSize="24dip"
      android:text="My Dresses"
/>

But what if, within the Activity code, I want to change one of these measurements? There are no Java methods in the Android SDK that accept density independent pixels!

Well, here's how. Just multiply the size in pixels by a scale factor defined in the context's resources, like so:

float scale = context.getResources().getDisplayMetrics().density;
float size = sizeInPixels * scale;

And there's that. I hope it helps :) Please join the conversation with a comment.