Saturday, December 17, 2011


I'm getting very close to releasing Alertagram 1.0 for the IPhone. SNAP & GO app for automatically sending photos to facebook and posting them as alerts on alertagram. This app also has a great batch upload feature for sending photos from your album galleries to facebook and making alertagrams.

There are some great Android and IPhone/IPad apps coming from RainApps.

Saturday, December 10, 2011

Say Cheese Festive Frames

This is just too funny. An example of a Say Cheese upload to facebook. This baby has no fear. But her cousin is not too happy about the Santa thing.

Thursday, December 8, 2011

Thursday, December 1, 2011

Wednesday, November 30, 2011

Apple Takes a Byte Out of Say Cheese

If imitation is the greatest form of flattery, then RainApps should be thanking Apple for including a camera voice control feature in their up coming IOS 5.1.

But Android users can get Say Cheese right now. Say Cheese has various voice commands that can fire the camera, including: “Take” and “Hey” and “Smile,” and Say Cheese will even talk back with all kinds of responses, including user defined talk backs.

So if you use or market androids, don’t be intimidated when a friend brags about how the IPhone now has a voice activated camera, because you can install Say Cheese Camera right now for free from the Android Market.

And Rainapps has an IPhone version of Say Cheese in the works for all you iPhone users that want even more voice control for your camera.

Thursday, November 24, 2011

Festive Frames with Shake & Snap in 1.5.8

Just posted the 1.5.8 update. With this update you get the new Shake & Snap feature and you can install the new Festive Frames for the Holidays.

Shake & Snap is an options you can find just under the Voice Controls. When turned on, you are able to snap a photo by shaking the camera. There's a 1.5 second delay before simulating the shutter button. This is very effective with voice response.

I personally wanted this feature for when I'm skiing and riding on the chair lift. Sometimes Voice Controls are out of range and I didn't want to keep my gloves off. So I set Shake & Snap On and Auto Save On and I'm good to go, all nice an warm. Pretty slick trick!

Monday, November 7, 2011


Now XCoding. This one is for Steve Jobs. Sorry I'm late Steve. Also, sorry I made fun of your Kauai house in my Rainhut novel. But building on the beach next to a public rest room? Just hoping you're having fun at the next level.

Checkout my xcoding programming tips page on this blog.

Sunday, November 6, 2011

Interesting user response

A user who's name is Jim posted this:

"I can't spare any phone memory when there are so many camera apps that will work on the SD card."

I've been trying to understand what he is saying. Say Cheese stores it's photos in the SayCheesePics folder on the SD card. Perhaps because the Say Cheese photos are in their own folder Jim had the impression that Say Cheese was not using the SD card. So Jim, if you see this blog, check your SayCheesePics folder to verify Say Cheese is using the SD card.

Ok, I've figured it out. This was a new one on me. In order to enable moving your app to the SD card you need to include "android:installLocation="auto" in the manifest.

Now Say Cheese supports moving the app to the SD card to save phone memory. This feature is now available in version 1.5.7. The Move to SD Card is a button in the settings/applications/manage applications/Say Cheese Camera. You can also move it back to the phone.

Thanks Jim!

Also, instead of posting a bad review, there is a Contact Us feature in the app itself. Just press the Menu button and there is a Contact Us option. We read all the feedback.

Tuesday, November 1, 2011

Continuous Voice Recognition

Just posted Say Cheese 1.5.6 with a continuous voice recognition option. It's a radio button under Voice Controls. This is a cool feature and a direct result of user feedback, so Thanks!

Using continuous voice recognition with auto-save enabled provides a completely hands free camera. You can even put the camera down while pointing at a target and issue voice commands from a distance. Then walk away and come back later and your phone is still waiting for voice commands.

Using continuous voice recognition will use more battery because Say Cheese just keeps listening even when the app is paused by the operating system. But for many purposes this is a great new feature and easily managed with the Say Cheese table of contents style scrolling settings screen. You can choose between normal voice recognition, no voice recognition or continuous. You still need to press the speaker button and turn it green to start listening in either normal or continuous mode. Press the green speaker again to turn off listening.

Monday, October 31, 2011

Alert Mode

New Alert Mode coming in the next release (1.5.8). Protesters will like this feature. Snaps a photo and then auto uploads and creates an Alertgram.

Tuesday, October 25, 2011

Android Market Active Installs Confusion

Google decides to just change the way they calculate active installs and everyone's 30 day chart drops like a rock because they then compare these calculations with the old calculations.

Who is in charge of quality control in this Android Market? Developers are going to revolt if Google keeps this up. There doesn't seem to be any real concern for developers marketing efforts and no real attention to details. I wonder why.

UPDATE! Google has resolved this 30 day chart issue. Good job Google!

Saturday, October 15, 2011

Samsung Galaxy S2

That Samsung is a remarkable phone. Just tested Say Cheese and it works great.

Google Telling Iphone Developers How to Code?

I just find if very funny to see Google telling Iphone developers how to code in Objective-C, Apples language. They wrote a style guide. What's more funny is that they are wrong.
Not taking sides here because Apple likes to make fun of Java, but common Google, at least get it right.

Tuesday, October 11, 2011

Please Contact Us Before Posting a Bad Review

We received a bad review because the users said voice commands were not working. But it turned out that he did not click the speaker button (lower left). The speaker needs to be green to accept voice commands.

The volume indicator is just below the speaker, not a big rectangle in the middle of the screen like you see with most voice activated apps.

Please use the Contact Us form in the app to send us questions before giving us a bad review. Press the menu button and then use the contact form to send us questions or suggestions. We answer all requests.

Thursday, October 6, 2011

New Say Cheese Addons

Here's an example of some new Say Cheese canvas based addons about to be released. These are cool. They will make a great addition to retro and groovy frames.

You get addons right from within Say Cheese. It's easy, like a game plugin. In the settings, just click the big blue button at the top to get to the Addons store. After you get an Addon, it will be available for install from the Live Frames Browser. Then just point at shoot with your target in the frame. Now Say Cheese can respond to your photos with voice and wrap them in cool texture frames. Try to think of a response that matches your frame. That's fun!

Wednesday, October 5, 2011

Good Bye Steve Jobs

Quite a story and what a ride he had. He will be missed. I finally get around to working on software for his inventions and now he's gone.

Sunday, October 2, 2011

Say Cheese 1.5.0

I would recommend updating to 1.5. This major version has zero memory, service or battery leaks. The entire process shuts down when you exit the app. It has other cool features like immediate voice response upon snapshot while concurrently processing the photo.

I wrote about how to eliminate the billing service leak that you will find in most apps using in-app purchasing. This tech stuff is under programming tips on this blog.

Say Cheese 1.5 also supports purchasing cool accessories like frames and textures that work live while you are snapping a photo.

Cool Accessories for Say Cheese

Thursday, September 29, 2011

Say Cheese InApp Shopping for Addons

I just published Say Cheese 1.4.9 with InApp shopping for addons. This will make finding, buying and managing your addons much easier. And we can provide new addons without the need to update The Free Say Cheese Camera app each time.

Saturday, September 17, 2011

Purchasing Addons directly from within Say Cheese.

Well, I'm just going to have faith that Google will fix the stats issue. Go Google! Now working on a way to purchase addons directly from with Say Cheese. This seems like possibly a better approach than packaging the content into separate install packages. This will also let us activate advanced features such as filters. So I'll put the Android In-App purchase feature through its paces.

Ok, you could write a book on this subject. I'll post some programming tips that cut through the clutter.

One of the bad things I've noticed and in all the samples and live applications using inapp purchases, is that they leave a dangling background service running. None of the sample code stops the background service when you leave the activity that launches it. Also, you will need two phones to test this because you cannot make purchases from your own developer account in the app you publish. 

Amazon and CNET

Published Say Cheese on Amazon and CNET ( Should be available soon. I'll provide links.

Well, Amazon wants you to post a version of your app that has users buy any addons directly from them. So it seems you can advertise other peoples products, but not your own. They have no in-app purching SDK. Still talking to them. post went without a hitch.

Wednesday, September 14, 2011

Android Market Download Statistics Are Not Updating

Day 23
with download stats frozen. Google, you can fix it. We believe in you even if we can't talk to you.

I was about to do a press release before this. Perhaps, I need to do a news release instead. Android Market download statistics are broken or frozen for some apps, including all of ours. Seems to be developer related, not app specific. Not very nice from a company that is supposed to be developer friendly and open. The interesting thing is that we were just a few downloads from a new category of 10,000 to 50,000 after a steady incline and that's when the stats froze. Not sure if that's related. I've emailed Google and filled out their contact forms with no luck, not even a response. But their little download graph for our apps keeps going down because the stats are not showing the new installs as a result of their broken or delayed system.

From blogging, I see this is pretty common and some developers have been stuck for weeks. That's not encouraging. I posted a new build, but that didn't help. Well, I'll just have to find a way to talk to someone there. That should be fun. Forum Complaints

Working on Iphone software. I wonder if IOS has this kind of problem.

Day 8 Update! I just received a nice email from Google saying they are looking into the problem. Well that's encouraging.

This is kind of funny. We have more Retro Frames sales than we have installs because of the Google's failure to update download install stats.

Day 12 Update! This is nuts! They found a solution for having more active users than installs. Now they no longer update the active users stat either.

Day 18 Update! From the phone's Android Market App, Say Cheese has jumped to the correct install category of 10 to 50 thousand and the count for the customer reviews seems to be updating. But from the website, the install count is still stuck. So the good news is that they may not have lost data.

Day 19 Update! Stats have been updated. Thanks Google! Please keep updating.

Day 22 Update! Stats are stuck again.

Day 28 Update! Working again.

Day 46 Update! Stats are stuck again. Obviously this is an on going problem for Google.

Sunday, September 11, 2011

Removed Greystrip Banner Ads

I removed Greystripe banner ads from Say Cheese 1.4.7. They ugly up the app and I can't see profits for a long time. Something wrong with this ad model. The ads coming in are completely unrelated to photography and they kept serving the same ads. So heck with that.

We will only be promoting our own Adons and other apps from rainApps itself. The alternative is a paid version with no ads, but I don't think that's a way to grow and improve a generic app like Say Cheese. We need users and feedback to make this a great product while we keep building cool paid for add-ons.

Other features in 1.4.7

Battery Saver Feature

Improved the Compass

Rotating the camera for portrait shots will now rotate the image to match. Thanks for all the requests for this feature!

Saturday, September 10, 2011

Retro Frames 1.1

Updated Retro Frames for Say Cheese. Now contains 15 cool live frames.

Friday, September 9, 2011

1.4.5 Update

Here's partial listing of improvements in the new 1.4.6 posted today.

Voice recognition starts after voice response finishes to avoid infinite verbal loops. Funny, but now fixed.

Doc Scan/Auto Focus begins focusing after the Smile request, not during.

Voice response begins after image processing to avoid sync issues.

Stealth is brighter and the hardware return button takes you out of stealth

Fixed location/time stamp auto size problems.

Hardware return button, while viewing a snapshot, acts like the save button and no longer just exits the app.  

You can frame existing photos from the zoom view now by pressing the frame button.

Added Auto Update helper menu item.

Improved frames browser that includes a “Get More Frames” button.

Avoids battery usage when paused or stopped. No background process except when uploading. 


Did you know?

How to check for battery usage by applications:

Settings/About Phone/Battery/Battery Use  

This will show the usage of battery by applications since booting. Some people look at usage and think the most recently used app is the biggest battery user and remove the app. They might even think the app is using battery power when it's not even running. This is not how these stats work. When that app is not running, it's usage percentage eventually goes down as other apps are used, but not immediately after stopping the app and running another. 

For example, I noticed that Skype was using battery power, so I force closed it and stopped its running service. But for a long time it's battery usage remained the same. Not because Skype was still using the battery, but because it's percentage relative to other apps had not changed. 

Tuesday, August 23, 2011

Live Frames Available

Release (1.4.4) includes Live Frames. This is a great feature. You can select frames, view them in the camera and then when a photo is taken, two images are saved, the normal and the framed photo composition. Live Frames also include image effects such as retro effects with color and scratch overlays.

You can purchase cool Six Packs of Live Frames as install apps. Here's the first one: Retro Frames

Tuesday, August 16, 2011

Say Cheese Camera Iphone

Just wanted to verify that I have indeed begun work on Say Cheese Camera for the Iphone/Ipad. Something I like about Iphone development is that there is only one device to support. But I still love the openness and open source from google for android development. I'm wondering what happens with Google now that they are becoming a phone maker like Apple. Is that good or bad news for developers?

Saturday, August 13, 2011

Published Feedback

Wow! The error reporting code I wrote about in programming tips is turning out to be valuable. I recommend you check it out if you are a developer.

After publishing Say Cheese, I've received some great feedback for the next release. I'll update to 1.4.1 in the next day or two. I've had issues with unsupported focus modes, and some other items causing exceptions that should be fixed in the next rev.

Also having a way to share Say Cheese itself is included in the update. Needed the App Store url before I could implement that feature.

Friday, August 12, 2011

Say Cheese Effects App

Besides the standard photo effects built into the camera and implemented by Say Cheese, we are getting requests for Advanced Filter Effects, such as outline and old photo surface effects and frames. There is already a button for using third party image handlers such as Google Googles, but providing our own is a good idea.

So, I'm writing a new companion app called Say Cheese Effects. I could publish this app within a week. It will launch directly from Say Cheese Camera, and visa versa. Effects will work with any photos in the gallery, not just those taken with Say Cheese Camera, so it will be a stand alone effects handler for use from other apps, not just Say Cheese Camera. But there will be a dedicated effect button in Say Cheese Camera to launch Say Cheese Effects immediately after taking a photo.

Effects will have some cool filters but also frame compositions, including old retro style frames with surface textures. This should be fun and a great enhancement to Say Cheese Camera. I'll post some programming tips as I write this puppy.

Wednesday, August 10, 2011


You can make facebook rainslides direcly from say cheese when batch uploading photos. Here's a snapshot of a rainslide I generated from Say Cheese.

Wednesday, June 8, 2011

Feature Requests

This Post is for feature requests. Just add a comment to this post asking for a feature so we have a record.

Test live on Multiple Devices...On the Cheap.

This requires a bit of courage and stealth behavior. It would cost tens of thousand of dollar to purchase all the android smart phones for testing. That's great for large companies, but what about the independent developers? Well this method works well. I've done it.

First email your .APK to yourself. Then visit your friendly Verizon, Sprint and AT&T stores. Who did I forget? Anyway, the trick is to act very interested in their phones. Who knows, you might actually find one you love and buy it, like I did, so your conscience is clear.

Now simply launch the browser app and open your gmail account, or any other web based email account you have. Then download the attached .APK that you sent to yourself and install your app. You will probably have to change the Application Settings to accept installation from Unknown Sources before you can install.

Now have fun testing your app and pretending to be stupid about smart phones when the sales person asks if you need anything. The best line is "Not yet, just looking." Also, and this is important, don't forget to implement Tip # 4 in the programming tips in this blog. That way if your App crashes on some device, you get a nice email to yourself with details about where it crashed and on what device.

One more thing. Don't forget to sign out of your email account. :)

So I tested Say Cheese successfully today on all the Sprint HTC phones including the EVO, Motorola Droids including the Droid X and the Droid X2, Verizon Thunderbolt, Sony Erickson. Had hanging issues and preview issues with the Samsung. Text to Speech not activated on Motorola phones and fixed that by simplifying the way TTS is initialized.

New Samsung Infuse had too many issues but I finally got it working. Why don't manufacturers make it easier for developers to get their apps working on their phones, and why is there not some standard that says these phones should all be released with the latest version of Android?

Saturday, April 30, 2011

Say Cheese 3D coming

I'm writing support for the new EVO 3D. Also just completed a new Stealth Mode feature and a shutter delay timer that says "Say Cheese" just before snapping the photo. Great new feature.

Monday, April 18, 2011

Beta 2.8

Say Cheese 2.8 is now being tested. Has the following improvements.

1. Better batch uploading of photos to facebook via rainSlides
2. New interface
3. Improved preview modes
4. Fixed rotation issues with xoom.
6. View Level Indicator
7. Compass
8. Standard Menu showing version and buttons menu items for showing the saycheese website, this blog, video, and rainSlides.

Monday, March 21, 2011

Posted beta 4.0

1. New graphics
2. Stability improvements
3. Memory management
4. Uploading improvements
5. New faster Gallery.
6. Sharing from Zoom View.
7. Support for Samsung phones.
8. Onboard Help System.

Monday, March 7, 2011

Wednesday, March 2, 2011

Android Programming Tips

In this post, I'll share some android programming tips I picked up building Say Cheese.

Tip # 1 Android 3.0 clipping dynamic views.

Few camera apps, if any besides Say Cheese, support all the devices possible picture sizes. Square 400x400 snapshots, for example. So I built a class, extending ViewGroup, with a basic FrameLayout where I add my camera SurfaceView.

public class CameraViewGroup extends ViewGroup {

then I override the layout method so I can change the size and position of my camera SurfaceFiew holder, or any other child objects in that group, like a zoom rectangle.

protected void onLayout(boolean changed, int l, int t, int r, int b)
MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY));
mCameraFrame.layout(newx, newy, neww, newh);

if (mSizeListener != null)


All is working great, when along comes Android 3.0 and the Xoom. Suddenly my Dynamic surface holder is being chopped off for no good reason.

Solution: The solutions is simple, but almost impossible to figure out. This now works on all Android devices and OS versions. So in your layout.xml file include
the android:clipChildren="false" tag in your custom ViewGroup definition. This fixes an incompatibility issue with Android 3.0 but still works with earlier versions.

Tip # 2 Front Facing Camera.

From what I can determine, Android does not support the front facing camera in versions below 2.3 (gingerbread). I had to use a special library from Sprint to support the front camera on the EVO. Sprint and Verizon are promising updates to the OS very soon so the best solution is to code in anticipation of those using Java Reflection. Here is a routine that will open the front camera if the phone has 2.3 or higher installed, and will not crash otherwise.

public boolean usingFrontCamera = false;
public boolean frontCameraFailed = false;
private Camera tryOpenFrontFacingCamera() {
Camera camera = null;
// Look for front-facing camera, using the Gingerbread API.
// Java reflection is used for backwards compatibility with pre-Gingerbread APIs.
try {
Class cameraClass = Class.forName("android.hardware.Camera");
Object cameraInfo = null;
Field field = null;
int cameraCount = 0;
Method getNumberOfCamerasMethod = cameraClass.getMethod( "getNumberOfCameras" );
if ( getNumberOfCamerasMethod != null ) {
cameraCount = (Integer) getNumberOfCamerasMethod.invoke( null, (Object[]) null );
Class cameraInfoClass = Class.forName("android.hardware.Camera$CameraInfo");
if ( cameraInfoClass != null ) {
cameraInfo = cameraInfoClass.newInstance();
if ( cameraInfo != null ) {
field = cameraInfo.getClass().getField( "facing" );
Method getCameraInfoMethod = cameraClass.getMethod( "getCameraInfo", Integer.TYPE, cameraInfoClass );
if ( getCameraInfoMethod != null && cameraInfoClass != null && field != null ) {
for ( int camIdx = 0; camIdx < cameraCount; camIdx++ ) {
getCameraInfoMethod.invoke( null, camIdx, cameraInfo );
int facing = field.getInt( cameraInfo );
if ( facing == 1 ) { // Camera.CameraInfo.CAMERA_FACING_FRONT
try {
Method cameraOpenMethod = cameraClass.getMethod( "open", Integer.TYPE );
if ( cameraOpenMethod != null ) {
camera = (Camera) cameraOpenMethod.invoke( null, camIdx );
} catch (RuntimeException e) {
Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
// Ignore the bevy of checked exceptions the Java Reflection API throws - if it fails, who cares.
catch ( ClassNotFoundException e ) {Log.e(TAG, "ClassNotFoundException" + e.getLocalizedMessage());}
catch ( NoSuchMethodException e ) {Log.e(TAG, "NoSuchMethodException" + e.getLocalizedMessage());}
catch ( NoSuchFieldException e ) {Log.e(TAG, "NoSuchFieldException" + e.getLocalizedMessage());}
catch ( IllegalAccessException e ) {Log.e(TAG, "IllegalAccessException" + e.getLocalizedMessage());}
catch ( InvocationTargetException e ) {Log.e(TAG, "InvocationTargetException" + e.getLocalizedMessage());}
catch ( InstantiationException e ) {Log.e(TAG, "InstantiationException" + e.getLocalizedMessage());}
catch ( SecurityException e ) {Log.e(TAG, "SecurityException" + e.getLocalizedMessage());}

usingFrontCamera = true;
if ( camera == null ) {
// Try using the pre-Gingerbread APIs to open the camera.
try {
camera =;
usingFrontCamera = false;
frontCameraFailed = true;
} catch (RuntimeException e) {
Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
return camera;
Tip # 3 Activity as Dialog without Title Bar.

I wanted to include a pop-up help feature in Say Cheese as its own activity and have a custom title with a return button. You would think this would be simple but it's not. You need to theme the activity as a dialog and then hide the title bar. Here's the trick. First you use a dialog theme in the manifest file for this activity. For example:

activity android:name=".help" android:theme="@android:style/Theme.Dialog"

But you can only have one theme for the activity so you need to remove the title bar in your code. Just add one line of code (see sample below) to your onCreate override for your activity to turn off the title bar. The net result is a nice popup dialog activity with no title bar.

public void onCreate(Bundle savedInstanceState) {

Tip # 4 Add runtime un-handled exception reporting

With all the different devices and Android OS versions, you need to know when something goes wrong and where in your code the problem occurs. From what I can determine, you can't do anything about the force close error window that pops up when you have an un-handled exception. But what you can do is create an error report and have the user email you the report if your program crashes. This will let you fix the problem without testing your code on every device and OS and every condition in debug mode on your own computer.. 

Tip # 5 InApp Billing. Fix the dangling service.

The Google Dungeons sample leaves a dangling service. Some people have blogged about this. 

Here's a fix.

In add the following code

    public int onStartCommand(Intent intent, int flags, int startId)
        handleCommand(intent, startId);
        return START_NOT_STICKY;

Then when you exit your application in your OnDestroy function add these two lines of code as your last lines of code in your OnDestroy


Monday, February 21, 2011

Friday, February 18, 2011

Say Cheese for Android by rainApps

We have started beta testing the Android app Say Cheese. This is a camera app with voice recognition, voice response, and photo uploading to Facebook with original photos saved in rainCloud for use in rainSlides. Anyone wishing to beta test this Android app, let me know and I'll email it to you.