Animate Innovations develops innovative software for the Android mobile platform. Meditation Words is a guided meditation program which walks the user through simple meditative exercises or prayers. It includes texts from from a variety of traditions.

In the following Ignite Portland video, Isaac explains what's so great about Android. For more about Ignite, check out the blog.

Animate Login is a proposed authentication scheme using QR codes and Internet-connected smart phones to allow a user to quickly sign into a web site without having to memorize or type in a username and password. The user only has to prove that they are in possession of their mobile phone. We've developed a demonstration app and web site for this approach which you can try if you have an Android smartphone.

The Android platform offers a set of security mechanisms to protect apps from one-another. Since apps can communicate with each-other and access each-others' data, there needs to be a way to protect that data from apps that shouldn't have access to it. The "permissions" system is one way this is accomplished.

The user sees this when they download an app and it warns them that the app wants to access the Internet, or read their contacts, or dial 911 or what-have-you. That's a pretty nice feature.

Android is made up of a number of communicating components. I wanted to visualize all of the applications on the system and how they interact via permissions. Let's look at the permissions system from this global point of view. Read on, or just view the big pretty picture.

I wrote a little app that allows a user to browse through the packages and permissions on an Android device, and as part of the process, it can generate a system map (using GraphViz) of all of the app and how they inter-relate.

I can run this app on the Android emulator, but when I run it on a real phone like my G1, the resulting image is very big, and I can't render an image with labels for the entire system.

Read on for the whole article and several pictures :)

Tuesday, May 26 at 6PM, Isaac will be giving a talk to the Mobile Portland group about the Android Market (sildes).

The Android Market -- Google's App Store Alternative
Tuesday, May 26th 2009, 6 pm
AboutUs offices
107 SE Washington St., Suite 520
Portland, Oregon 97214

This is a co-talk with Don Park of Ice Condor fame. Our draft slides are available now. RSVP here or Add to your calendar.

Everyone has heard the stories about the iPhone's App Store and the success some developers are finding selling iPhone applications. What people know less about is Google's Android Market which started allowing people to sell applications in February.

Learn about the similarities and difference between the Android Market and the iPhone App Store. Take a look at what's selling and the opportunities that will come as more Android-based handsets reach the market.

Isaac will share his experience trying to sell applications on the Marketplace, the challenges involved, and where the opportunities lie.

One of the great strengths of the Android mobile platform is that there is a well defined interface for applications to communicate with one-another. This makes it so that functions and features of one application can utilize functions and features of another application to build something new. Very cool stuff!

Together with the power of open source software, this capability makes it possible to add new features to an application in just a few minutes. I'm going to show a small example of how this works using QR codes which are a kind of 2-d barcode that can encode an impressive amount of information, over 4,000 characters. You can generate QR codes yourself if you want to try it out. Here's a QR code that would take you to the Animate Innovations web site:

ZXing (pronounced "Zebra Crossing", which is called Barcode Scanner in the Android Market) is an open source QR code generator and scanner.

The goal of my little project is to be able to pass notes between two mobile phones. This is accomplished by using the camera on one phone to scan the displayed barcode on another phone.

ZXing's startup screen explains it visually:

There is an excellent open source notepad application for the Android called OI Notepad. It has lots of cool features like reading notes from the SD card, sending via email, and even encrypting notes. So let's add the ability to scan a QR code and insert that data into the current note.

The first step was to copy a couple of files from ZXing source code into the OI Notepad source tree. These files aren't strictly necessary, but IntentIntegrator.java offers some helpful code to call the scanner.

Scanning a Barcode:

In OI Notepad, add a menu item for scanning a barcode:

In the NoteEditor.java file, we'll add something like this:

menu.add(1, MENU_BARCODE_INSERT, 0, R.string.menu_barcode_scan)
        .setShortcut('1', 'b'));

Now let's handle barcode scanning: Modify the code that handles the menu click callback to add a call to "initiateScan" which is provided by the IntentIntegrator file in zxing's source code:

    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle all of the possible menu actions.
        switch (item.getItemId()) {
       //...
        case MENU_BARCODE_INSERT:
        	IntentIntegrator.initiateScan(NoteEditor.this);
        	break;
         //...
    }

That call to "initiateScan" invokes an inter-process call in Android. In this case, it launches the BarcodeScanner application, which is a totally different program. Using barcode scanner, the user can now point the camera at a barcode, which is scanned, and sent back to our application in plain text. We have to handle the callback:

    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
    	switch(requestCode) {
       //...
    	case IntentIntegrator.REQUEST_CODE:
    		if (resultCode == RESULT_OK) {
    			IntentResult scanResult = 
                         IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    	    	if (scanResult != null) {
    	    		String out = scanResult.getContents();
    	    		if (out != null) {
    	    			insertAtPoint (out);
    	    		}
    	    	}
    	}

The core of what we're doing here is scanResult.getContents() which returns the scanned barcode as a string. The function "insertAtPoint" just inserts any String into the current note at the current cursor position.

And that's it! It doesn't take much code to integrate these two applications, and ZXing does a great job of helping out by providing the IntentIntegrator class. However, ZXing does not have any helper functions for generating barcodes, so that'll be slightly more complicated.

Generating QR Codes with ZXing's Intents

Intents are at the core of Android's IPC mechanism. The initiateScan function just called out to an intent under the hood, so we're going to create a similar function for encoding text in a barcode, and we'll add that function to the IntentIntegrator class so that others can use it:

public static void encodeText (Activity activity, String text) {
  	Intent i = new Intent();
  	i.setAction("com.google.zxing.client.android.ENCODE");
  	i.putExtra ("ENCODE_TYPE", "TEXT_TYPE");
  	i.putExtra ("ENCODE_DATA", text);
  	activity.startActivity(i);
}

There are 3 things to do here: Set the action, set the parameters, and start the activity. The action is "ENCODE", and it's fully qualified by the zxing name so that the Android OS knows what application to call to encode that string as a bar code. There are two parameters (or "Extras") one for the type of content, in this case plain text (it could aslo be a URL or a contact), and the data to be encoded.

The result should be something like this:

Since the activity we're calling doesn't actually return any results (unlike the SCAN activity), we don't need to write a callback.

One complication that always comes up with intents is that zxing might not actually be installed on the target system, so in reality, we have to handle an activity not found exception:

  	try {
  		activity.startActivity(i);
  	}catch (ActivityNotFoundException e) {
  		showDownloadDialog(activity, stringTitle, stringMessage, stringButtonYes, stringButtonNo);
  	}

In this case, it's handled by displaying a dialog inviting the user to install the barcode scanner.

Integrating this into the Notepad application is simple. Add a new menu item as before, handle the menu item click, pull the text from the note, and call our encode helper:

IntentIntegrator.encodeText (NoteEditor.this, mText.getText().toString());

Conclusion:
That's all it takes to integrate two Android applications to create a pretty cool new feature: passing notes between two mobile phones with nothing but the camera.

(This article was originally published at SyntaxPolice.org.)

On Thursday, February 19, 2009, I gave a talk for Ignite Portland about the Android G1 phone (video and slides). What is Ignite? It's about sparking ideas in one-another. Each presenter gets 5 minutes to speak, exactly 20 slides must be used, and the slides auto-advance every 15 seconds.

It was an exciting experience! I was very nervous, but I was happy with the outcome and the audience reaction. I think there were over 600 people in the audience, so it's the biggest crowed I've addressed. I definitely recommend giving Ignite a try if you like to share your ideas. There are Ignite events in many, many cities. The other speakers were absolutely incredible. If you weren't there, you should watch the video of the entire event.

Android is a Linux-based open source operating system by Google that can be used to power smart phones like TMobile's G1. It's a very open platform, and easy to develop software for. In this talk, I give an overview of the development environment and highlight some key features of the operating system with a focus on what makes the open nature of the Android so powerful.

For programmers, this talk will aim to be an effective introduction to Android so that you can go home, install the development tools, and start hacking even if you don't have a phone. For non-programmers, this talk will aim to give you a taste of how open-source principles will soon affect a cell phone near you.

I like giving talks, so if you want to hear more about Android, let me know. For information about the projects I'm working on, see the pages on Meditation Words a well as Crypto Intents.

The Ignite volunteers were awesome, and there are official photos and official video of the event, including video of my Android talk. The video has very nice production quality, with good cuts back & forth with the slides, but you can't hear the audience reacting very well:

If you get a chance, check out the OpenIntents project, and if you're in Portland, the Android meetup is the 2nd Monday of every month at the SE Hawthorn Lucky Lab at 6PM.

As I mention in the talk, a portion of the proceeds for Meditation Words goes to Kiva, the world's first person-to-person micro-lending website. Microcredit is the extension of very small loans (e.g. $25) to the unemployed, to poor entrepreneurs and to others living in poverty.

P.S. Here's the exact same talk from another angle: This version from @linuxaid doesn't integrate the slides as nicely, but I kinda like it better since I can hear the audience laughing at my jokes ;)