Programming and general geekiness.

I first released Keep Calm for Android over a month ago and it remains the best Keep Calm and Carry On app available on Google Play with over 30,000 downloads and over 200 ratings. Recently I’ve had a number of comments suggesting that the ‘app freezes on the loading screen’ and other basic problems so I thought that I would write up a quick guide for basic usage. Please note that I am launching an awesome update to the app within the next week which gives it a completely new UI with loads of new options.

1) The home screen

This home screen (its not a loading screen!) is pretty simple and you can just press ‘Design’ to get going. There isn’t much interesting stuff on the ‘About’ screen.

2) The design screen

This screen is also pretty easy to use. When typing the text you do not have to have it on separate lines and if you do have it all on one line it gets split by word. Capitalization isn’t important because this happens automatically, staying true with the original poster. If you don’t type in anything the default text of  ‘KEEP CALM AND CARRY ON’ is used. The icon button probably doesn’t need any explaining – just tap it to be presented with a choice of 50 icons and then tap the one that you want to use. Tap the color button to pick a new color.

The color system used by version 1.x isn’t great, sadly (although it uses a color wheel in version 2). The sliders use the RGB color system where each color is represented by its red content from 0 to 255, green content from 0 to 255 and blue content from 0 to 255. To put it in perspective the color black is R0, G0 and B0 (because it doesn’t have any red, green or blue) and white is 255, 255, 255. The sliders therefore give you a choice of 16.7 million colors. You can the tap ‘Use Color’ once you are happy. Unfortunately version 1.x doesn’t allow you to change the text color so I have to recommend that you use darker colors.

3) The final poster

Once you’ve tapped ‘Design’ you’ll be able to see a preview of your final poster. The poster is rendered at 600 pixels wide by 900 pixels high. You can either tap the poster itself or press the Menu button on your phone to display the menu. As of version 1.2.2 tapping Save will save the image to the SD card and then display it in the Gallery app. In earlier versions it seemed that a user had to reboot their phone or wait a significant amount of time for the image to appear in the Gallery however a bug with Android stops the Gallery app refreshing by itself so I added one line of code to force it to refresh. Sharing will display a menu of different options for saving, dependent on which social networks’ apps you already have installed (so you’ll need the Twitter app to share on Twitter, the Facebook app to post on Facebook, etc).

Setting as wallpaper works exactly like saving except that a new image has to be generated because Android handles wallpapers in peculiar ways and requires a landscape image so it occasionally takes a while to set the wallpaper on older devices, but on new devices it is pretty much instant.

Hopefully this guide will have helped some of the users that are having issues with version 1.x. If you have an older version than the most recent 1.2.2 update I highly recommend that you update although in a week there will be an awesome new update that will give loads of new features, such watch this space!

Your Country Needs You v1.1


I’ve done an update for Your Country Needs You which brings it to version 1.1 on the Android Market. It now allows you to modify the background color which seemed to be a logical progression and the only reason that it wasn’t in the original version was because I completely forgot to add it in. In a future version I do intend that it will be possible for you to modify Lord Kitchener’s face however he is sticking around for the time being.

Your Country Needs You on the Android Market

Keep Calm v1.2.2

This isn’t really a major update to Keep Calm for Android however it finally fixes the issue of posters not saving properly. It turns out that they were saving all along, however the Gallery app doesn’t refresh the picture list straight away. I’ve written up an explanation here.

Keep Calm for Android

As a natural follow up to my Keep Calm and Carry On app it made sense to develop another similar app based on another famous British wartime poster. This new app allows you to modify the text of the poster however you will soon be able to change Lord Kitchener’s face to your own face and also change the background color (this update will probably ship in the next week).

The app also fixes the saving error in the Keep Calm app* – it turns out that your posters were saving but not always appearing in the gallery. This was a technical error in that the gallery app doesn’t check for new images when it loads and so adding one extra line of code in my app automatically refreshes the gallery. As well as saving you are also able t0 share, set as wallpaper and choose from three fonts – Alfa Slab One, Enriqueta, PT Sans.

This slideshow requires JavaScript.

Your Country Needs You on the Android Market

*Don’t worry, I’ll be updating Keep Calm so you can save your pictures properly in that too.

If you’ve ever worked with Android development before you’ll probably know that once you get it right it can be incredibly rewarding however if you get it wrong it can be a real pain to fix. Sometimes the development also demonstrates the fragmentation of Android and how it can be a great challenge to do something relatively simple because it works differently on different devices.

I recently developed the Keep Calm app for Android that allows users to create Keep Calm and Carry On style posters. The app has been a reasonable success (20,000 downloads in a month) however there has been one major issue: not everyone could save properly. At first I didn’t really understand why this was because all of the testing I had done indicated that the Bitmap object that the image was stored in was being correctly saved to the SD card and it would then appear in the Gallery app. However, this was not the case for everyone.

I soon discovered that it wasn’t a technical issue with my app entirely. The default Gallery app gets a list of files in the various images folders on the SD card each time it loads but the Android system doesn’t always refresh this list of files very often – sometimes only when the device is restarted. Clearly it would have been a major issue for my users to have to restart their phone each time they wanted to view a file so I came up with this solution:

String saved = Images.Media.insertImage(this.getContentResolver(), bitmap, title, description);
Uri sdCardUri = Uri.parse("file://" + Environment.getExternalStorageDirectory());
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, sdCardUri));

The bitmap object is of type Bitmap whereas title and description are both Strings. The sendBroadcast function (your activity inherit it as the class extends Activity, where the function is) then forces the OS to remount the SD card as it would do when the device starts up meaning that your picture will appear in the Gallery app. If you want to prove this to your users you can load up the file in the app:

Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(saved), "image/*");
startActivity(intent);

This then loads the image up, using an Intent, in whatever the default Gallery app is. Remember that you’ll need to add the android.permission.WRITE_EXTERNAL_STORAGE to your Android Manifest otherwise the app will fail. The obvious progression of saving is, of course, sharing and Android makes this incredibly easy to do without having to use the APIs of all the various social networks that exist – instead the app can just utilize services provided by other social network apps on the phone. Here is how to do it:

Intent sharingIntent = new Intent(Intent.ACTION_SEND);
sharingIntent.setType("image/png");
sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(saved));
startActivity(Intent.createChooser(sharingIntent, "Share image"));

This loads up a menu (unless no options are available other than email) headed with the “Share image” text asking the user what service they would like to share it with. The appropriate app will then launch. Another cool thing I’ve done using a Bitmap is to set the wallpaper. You’ll need to ensure that the Bitmap is double the width of the user’s device and the same height (explained in this Lifehacker article) – this could be done using a Canvas. Here is the code you can use:

WallpaperManager wallpaperM = WallpaperManager.getInstance(this);
wallpaperM.setBitmap(newBitmap);

Like with saving, you’ll need to ensure that you add the android.permission.SET_WALLPAPER t0 your manifest otherwise, again, the app will fail. Hopefully this article has helped you with your projects and if you have any other problems leave me a message in the comments.

I really like doing Android development and over the past few months I’ve done quite a bit of it but I found at the beginning that some things didn’t seem to be entirely logical that were quite important despite the fact that I already had a vast programming knowledge. Here is a list of things I reckon are useful for learning Android development:

  • Java experience: I don’t think that you need to know loads of Java to develop Android apps but I would say it is important that you at least know the syntax and roughly how to do things. Experience in a similar language like C# or C++ would probably get you by, just so long as you know the difference between a package, class and that kind of thing
  • Experience in another object-orientated language: Some experience in another language would also be useful because despite the fact that most Android development is in Java it is useful to understand how other languages do things because a lot of the Android specific Java has had influence from C++
  • An understanding of how apps work: This would probably come with programming experience but you really aren’t going to get anywhere if you don’t get how the most basic apps. Reading a few tutorials can help fix this
  • Experience creating user interfaces via code and and a visual designer: Android uses both XML layouts and pure Java code to create User Interfaces so provided that you have done something in both before you’ll probably be fine. I should imagine that it would probably be OK if you’ve done JavaScript DOM and HTML
  • Basic knowledge of XML and SQLite: You won’t need to know how to do these perfectly but so long as you can create XML documents and edit them. I wouldn’t say SQLite knowledge is vital but it would be good to have some database knowledge
  • A basic understanding of other mobile platforms: I had done a tiny amount of iOS and Windows Phone development before starting Android which probably helped me a tiny bit because it gives you some knowledge of design. Windows Phone development is probably more different to Android than iOS, so even if you’ve just created a calculator in iOS you’ll be in a good position to start Android development
  • Good resources for testing: The emulator is good but I’ve found that it always useful to either have at least one Android device for testing. I also recommend setting up a few different devices in the emulator with different screen sizes and versions of Android because that will give you a chance to test in loads of different environments
  • You’ve read some stuff on Android development: It is worthwhile reading up on Android development before you get started. Android Design and the Android Guide are both good places to start and reading some blogs will probably help develop your ideas. If you get stuck, make sure that you go on Stack Overflow.

Once you are fairly confident with all of this I recommend going over to Lars Vogel’s site which has some great development tutorials.

Keep Calm v1.2

Click the image to download

I’ve just updated Keep Calm to version 1.2, which I plan to be the last major update for a while. Version 1.1 introduced sharing and a less buggy UI whereas v1.2 has completely revamped the app: you are now able to generate a wider image for use as a wallpaper and customize the image. I had considered allowing users to use photos as the icon but it seemed a little easier to allow users to instead select from fifty built in images.

The images include everything from zombies to alternative crowns and cats to trees. The default image is the standard crown however there is no reason not to take advantage of the other images. The only major disadvantage is that it has doubled the size of the app from about 150KB to around 300KB – although I don’t see that as a major issue.

A lot of people have contacted me saying that they’ve had problems saving the image. After having looked into it I’ve made a few modifications to my code however it is worth noting that it requires your phone to have a SD card or some form of external storage. As soon as a notification is displayed that says ‘Image saved’ the image should be visible in your phone’s gallery app.

Follow

Get every new post delivered to your Inbox.