A Modest Proposal (With Apologies to Jonathan Swift)

A Modest Proposal (With Apologies to Jonathan Swift)

Once again, while working with Android, I’ve been bitten on the backside by differences between devices and how the camera works.

In the latest incarnation, users uncovered a problem where the DroidX camera (using com.motorola.camera) simply stops working. And not just for our app; for all subsequent usage until the phone is restarted.

Simply by taking a picture.

Apparently there is a known issue with the Motorola camera app and marking photos with GPS data.

But here’s the thing – why the hell is it so impossible for Google to simply say, “this is the camera app – use it, or else?”

If I sound frustrated, it is because I am. Camera issues account for 95% of the headaches I have when dealing with Android app problems (the other 5% usually involve memory allocation).

So, borne of my frustration, I make the following modest proposal:

In the future, before certifying a handset as being an Android device, Google should change their licensing to require handset manufacturers / carriers to provide a ROM-identical simulator for every Android device they ship. Running the exact apps that run on the actual device in the wild.

Without having actual hardware on hand, it is impossible – IMPOSSIBLE – to realistically test 100% of a device’s capability.

And when the carrier or handset maker ships a custom camera app, without a physical handset on hand, there is zero hope of testing – and guaranteeing – that an app will work with that particular handset.

It’s a small miracle that more outrage isn’t commented upon. Because it’s certainly out there.

As an Android user, I feel the pain personally. As an Android developer, it is a big point of pride to try and release the best possible software that I can.

But when every handset maker and carrier chooses to pick and choose core peripherals (like camera, video, gps, etc.) that they will support – or not – in a standard – or not – way, it makes the job of creating 99.99% up time, quality software nigh impossible.

At least not without sounding like you’re a whining excuse maker.

It is what it is.

I simply believe that Google must step up and think more of what this is doing to user experience and how app developers are bearing the brunt of the shoddy crap that is coming out of Motorola and the other carriers.

Instead of being concerned with spreading the Android “brand” at the expense of defining what, exactly, it means to be minimally “Android” in  anything approaching a uniform sense.

Android Market Filtering and AndroidManifest.xml

Android Market Filtering and AndroidManifest.xml

If you have an application in Android Market that is visible to some users, but not others, chances are there is some filtering going on by virtue of some statement you have in your Application Manifest file, AndroidManifest.xml.

Usually, this filtering occurs through a major setting: operating system version, whether the device has a camera or a GPS, etc.

Sometimes, however, it is the little things that get you in hot water.

Take for example the following manifest statements:

<uses-permission android:name=”android.permission.CAMERA” />

<uses-feature android:name=”android.hardware.camera” />

<uses-feature android:name=”android.hardware.camera.autofocus”/>

As constructed, these statements will hide the corresponding app from any phone that does not have a camera AND does not have autofocus capability (not simply that your app can use autofocus).

Likewise, if you have the following:

<uses-permission android:name=”android.permission.CAMERA” />

The implication is that your app uses the camera and ALL features available to a camera (autofocus and flash) – and if the phone is missing a flash OR autofocus, the app will be invisible to Android Market. Double-plus un-good.

The magic secret sauce to requiring a camera, but not requiring that the camera have flash or autofocus, is the following set of manifest statements:

<uses-permission android:name=”android.permission.CAMERA” />

<uses-feature android:name=”android.hardware.camera” />

It is frustrating that something so subtle can severely hinder your ability to market your application, or even allow your customers to even see your application.

Madness, really.