Thursday, April 14, 2011

Google I/O Developer Conference

I'm thrilled to announce that I will be attending Google's I/O Developer Conference this May. The yearly conference covers everything nerdy at Google from App Engine to Android.

Even more exciting is that I won my ticket in the Last Call for Google I/O 2011 Android Challenge. 10 winners were chosen from 70 app submissions. The contest was particularly challenging as contestants had 20 hours to work. Subtract eight hours for sleep as this new dad was not about to pull an all-nighter and use much needed sleep. Despite never writing any animation in Android, I managed to pull something out with about 2 hours to spare.

Revisiting ItemizedOverlay

I previously blogged on ArrayIndexOutOfBoundException when modifying ItemizedOverlay items on-the-fly, stating that they could be avoided. After much more use, I no longer believe ItemizedOverlay is safe for maps where content changes.

If you're developing an application that uses Google's Map API for Android and you need to add/remove items from the map while displaying the map, you have a few options:

1) "Allocate" all your objects in advance and disable items that should not be shown. This means you will not add/remove items to the ItemizedOverlay backing collection, but instead manage which ones are drawn in the draw() method. This may work well for many, but did not work for my scenario.

2) Create your own implementation of Overlay that handles concurrent modifications to its data structure. I chose this option, in particular because I didn't need all the capability that ItemizedOverlay offers.

3) Something else?

Thursday, December 16, 2010

Roam Override Widget

New app on the Android Market today, the Roam Override Widget. The widget allows users of Qualcomm based CDMA phones to manually force their phone into a roaming mode. This is particularly useful for users who occasionally experience a weak, unreliable signal, but the phone will not roam to the stronger network. Unlike other options, this widget does not require root access.

Tested on the LG Optimus S, but should work on others. Give it a try and let us know your experience! Most custom ROMs do not include the software stack required for this to work. This app is targeting users who do not root or modify their ROM.

Tuesday, November 23, 2010

Android Applications I Use

Putting the applications I write aside, here's a list of the Android applications I have installed in no particular order. Applications in bold are used often. I'll try to get back to this list and update with descriptions or links.

  • Amazon
  • Angry Birds
  • Autozone
  • Barcode Scanner
  • Chrome to Phone
  • Congress
  • eBay
  • Epicurious
  • Facebook
  • Google Finance
  • Google Gesture Search
  • Google Gmail
  • Google Goggles
  • Google Buzz
  • Google Search
  • Google Sky Map
  • GPS Status
  • Hotspot Widget
  • IMDb
  • Google Maps
  • Mileage
  • Google My Tracks
  • Flixster
  • OBD II Reader
  • OpenSpark
  • Overstock
  • Pandora
  • Photoshop
  • ESPN Scorecenter
  • Shazam
  • Google Shopper
  • ShopSavvy
  • StopWatch & Timer
  • Swype
  • Target
  • The Weather Channel
  • Torque
  • Transdroid
  • Twitter
  • Urbanspoon
  • Google Voice
  • Google Voice Search
  • Wordpress
  • XBMC Remote
  • z4Root

Thursday, November 18, 2010

New Phone - LG Optimus S

My previous phone, the HTC Hero was once considered high-end for an Android phone. Back then, there wasn't much for choices, the Hero followed the HTC G1, and roughly matched the functionality of the MyTouch.

Today there are a wide variety of phones from junk to super high-end. I envy the owner's of the HTC EVO 4G, but it's difficult for me to justify the $200 up-front + $240 in additional fees over the 2 year contract. RadioShack and Sprint recently offered a promotion for the new low-end LG Optimus S for $0, no rebate required. That's $440 cheaper over 2 years than the EVO.

I took the plunge, and I'm delightfully surprised at just how nice the Optimus S. In many ways it's a big upgrade from my HTC Hero, but with a few caveats. Here's the quick rundown.

  • Stock Android 2.2.1 - Froyo tastes great.
  • Faster CPU. The 600mhz CPU is a big improvement, even beyond raw numbers.
  • GPU. Added acceleration for graphics. I can play Angry Birds now.
  • Slightly thinner, smaller.
  • More responsive touch screen.
  • Dedicated 2-stage camera button.
  • Dedicated voice dialer button.
  • No blinding notification light while charging
  • Proximity Sensor turns phone screen on and off automatically when calling.
  • Very fast and accurate GPS
  • Swype keyboard included free
  • Can be rooted.
  • Only Sprint app is SprintID. No junk.
  • Wireless hotspot capability
  • No notification light for SMS, Email, Missed Calls, etc.
  • No trackball. Made text editing a bit easier.
  • No light sensor. Screen brightness is fixed to your setting.
  • No dedicated dial and hang up button. Not really necessary on this phone.
  • Low-resolution 480x320 screen.
  • New Phone and Brand - No community for custom ROMs yet.
  • SprintID is confusing and an annoying addition.
  • The Google first time use wizards have been removed. I found these helpful as an experienced Android user and they were certainly helpful to new Android users.
  • I can't tell if the Google Backup facility is there. If I reset, will my apps automatically reinstall?
  • Included SD Card randomly mounts/remounts. I replaced mine with an 8GB and this problem has never occurred.
  • Can't set voicemail provider in settings. I tried to set it as Google Voice, but there's no option. So far this has had no functional drawbacks, but I like to do it "right".
Coming from a Hero, I can handle those drawbacks and gladly accept the improvements.

Wednesday, April 7, 2010

Android Widgets, the Lowest Common Denominator

I should be nicer, modern smartphones are meant to be intuitive and user friendly, but they're more powerful than ever and with that comes complexities. As such, some people just don't know how to use an Android widget. They see them, they may have even used them before, but they don't know how to use yours.

What am I talking about? If you've written a Widget only application for Android, you may have encountered some baffling negative feedback; users complaining that the application just doesn't work. In their defense, it might not entirely work. After downloading an application from the Market, the user may encounter an installation complete screen with a button to launch the newly downloaded application. In the latest versions of Android, if there's not an Activity defined to handle the MAIN intent, the button is grayed out. But in older versions, I've confirmed 1.5, that button is not grayed out. When the user clicks the button, an error is displayed.

Another way the user may encounter the same problem is from the notifications area. A notification is made indicating that the application installed successfully. When tapping on this notification the application is launched. Again, without a main activity, on older versions of Android, this will result in an error.

It may seem obvious to you that you've developed an application, and the user should add it to their home screen by pressing 'Menu' from the home screen and following the menus to add a widget. Unfortunately, it's not obvious to everyone. So here's the easy work-around. Create a basic layout with just a TextView. Fill the TextView with some instructions as to how a user should add the widget to their home screen. Extend Activity and create a dumb Activity class that sets the content view to the instruction layout. Finally, register this new Activity in your AndroidManifest as the consumer of the MAIN intent.

Instead of encountering an error, the user is confronted with obvious, yet helpful instructions. Hopefully you'll encounter a happier commenter as the result of these simple changes.

Thursday, April 1, 2010

San Francisco, CA Muni Bus Locator

The Muni Bus Locator allows you to stay inside until the bus is outside. Select a route, and the route, buses, and stops are drawn on an interactive map. Click a bus to see it's speed and status. Zoom in to see individual stops. Select a stop to see the predicted next arrivals. Press the menu button to select another route, or change map mode mode from Map to Satellite.

Search the Market for: Muni Locator

Or... Click/Scan the QR code below: