Tagandroid

Android Income Report #16: August 12

Here’s August’s report.

If you are new to this series, let me explain it to you: Since Android is an open platform, I decided to be open about the income I’m making with my private Android apps too. In the last report I aimed to reach $2,000 for the last month. You will see if it worked out.

For all income reports, please click here.

Which Apps?

3D Invaders – about 286,000 installs (+9k),

AL Voice Recorder – about 874,000 installs (+28k),

AL Voice Recorder Ad Free – 1,206 installs (+29),

SmsToSpeech full – 795 installs (+10),

About 38,000 new downloads in total.

Advertising Stats

Here are some statistics from the two advertising networks I’m using, AdMob and Madvertise. Please read the second income report for an explanation of the following numbers.

AdMob:

Requests: 421,508 (-72k)

Impressions: 416,477 (-72k)

Fill Rate: 98.81% (-0.07%)

Clicks: 16,208 (-0.2k)

CTR: 3.89% (+0.53%)

eCPM: $1.68 (+$0.35)

House Ads: 15,145(+5,425)

Adjusted Requests:  436,653 (-67k)

Adjusted Fill Rate: 95.38% (-1.59%)

madvertise

Requests: 462.275 (-125k)

Impressions: 25,168 (-4.5k)

Fill Rate: 5.44% (+0.39%)

Clicks: 1,521 (-303)

CTR: 6.04% (-0.1%)

eCPM: $3.57 (+$0.09)

How much?

Here are the numbers:

AdMob:

3D Invaders: $193.19

AL Voice Recorder: $506.43

AdMob Total: $699.62 (+$49.70)

 

madvertise:

3D Invaders: ~$57.54

AL Voice Recorder: ~$32.38

madvertise Total: ~$89.92 (-$18.93)

 

Market sales: ~$84.94 (-$36.84)

In-App purchases: ~$2.54 (-$12.72)

Total: ~$926.59.82 (+$20.77)

What’s next?

I didn’t reach my last month’s goal, so, again, it will be $2,000 for the month of July.

 

Please feel free to share your own experiences and hints in the comments. Ask questions, share, do whatever you like.

Two simple ways to make your users aware of incorrect input

Did you ever enter a wrong password and got an AlertDialog telling you that you entered something wrong? You probably did and you probably also noticed that this alert dialog most likely takes one more click to continue, a click that could be saved. One way to avoid the AlertDialog are Toasts. Here are two nice but rarely used other ways to tell your users that they should enter something different.

Setup

Let’s assume we have an EditText which we use in our UI.
EditText mEditText ;
//...
mEditText  = (EditText ) findViewById(R.id.myEditText );

Furthermore we have a method showError() which we call when the EditText contains invalid data.

1 Shake

A nice way to show the user that, for example, an entered password was incorrect is to shake the EditText. Please note that I took this code from the official ApiDemos and modified it slightly.

First, we have to define our shake animation. Go to your res folder, create the subfolder anim and place a file shake.xml in it. In this file, create a translation like this:
< translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0%" android:toXDelta="5%" android:duration="1000" android:interpolator="@anim/cycle_7" />

TranslateAnimations let us move views ond the x or y axis of our screen. Since we want to shake it from left to right, we only apply the translation on the x axis. We move it from zero percent of the view’s width to five percent of the view’s width and let the translation last one second (1000 ms). Furthermore, we use the interpolator cylce_7 wich is placed in anim/cycle_7.xml and looks like the following:
< cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:cycles="7" />

It’s a simple CycleInterpolator. This kind of interpolators express the number of repetitions an animation should do. In our case, we repeat the animation seven times.

Now we only need to apply our shake animation to our EditText every time something incorrect is entered. We can do it like this:

private void showError() {
Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
mEditText.startAnimation(shake);
}

That’s it. Super easy, super smooth integration into the UI.

2 SetError

This is my personal favourite. It is the setError()-method which comes out of the box with the EditText view. When calling this method, the right hand compount drawable of the will be set to the error icon. When the EditText also has focus, the text you gave to setError() will be shown in a popup. If you don’t like the default error icon, you can also use setError(CharSequence error, Drawable icon) to set your own icon. The routine to show errors can then look like this:

private void showError() {
mEditText.setError("Password and username didn't match");
}

Which will result in errors shown like this:

setError() on ICS

setError() on ICS

Which looks good, catches the user’s attention and doesn’t need any extra clicks to disappear.

Conclusion

Showing errors without interrupting the user flow can be accomplished easily on the Android plattform. For even more attention by the user, the two methods mentioned can also be combined.

 

Please feel free to share your methods of showing error messages in the comments.

How to add attributes to your custom View

Jack just asked the following questions on the tutorial for animated GIFs I once wrote:

“I want to be able to place the GifMovieView in an existing layout (like any regular control).
Please give me a step-by-step of how to bind xml layout attributes to this custom view.”

A good question. Here’s the answer.

1 Use your own View in an XML

To place your own View in an layout XML file, just use it like a normal view, only that you have to append the whole package name up front. Something like:

< eu.andlabs.tutorial.animatedgifs.views.GifMovieView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/my_id"
/>

In this XML, you can already use the standard Android attributes.

2 Define your custom attributes

If you want to define your own, custom attributes, go to the res/values-folder and create a file called attrs.xml.

You can define your custom attributes here. In the end, it should look like this:

< ?xml version="1.0" encoding="utf-8"?>
< resources>
< declare-styleable name = "eu.andlabs.tutorial.animatedgifs.view.GifMovieView">
< attr name="url" format="string" />
< attr name="fetchAutomatically" format="boolean" />
< /declare-styleable>
< /resources>

You can now address these attributes in your XML layout. To do so, add something like

xmlns:gif="http://schemas.android.com/apk/res-auto"

To your root layout element. Please notice that this only works with ADT 17 and older. Now you can access your attributes in your layout like this:

< eu.andlabs.tutorial.animatedgifs.views.GifMovieView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/my_id"
gif:url="http://mygif.com/mygif.gif"
gif:fetchAutomatically="true" 
/>

3 Handle the attributes in your View

Since the XML is done, it’s time to address the Java part, which means the custom View. You should at least overwrite the constructor that is receiving a Context and an Attributes-object. Like so:

public GifMovieView(final Context context, final AttributeSet attrs) {
super(context, attrs);
init(attrs);
}

You can now access your custom attributes in using the AttributeSet:

private void init(final AttributeSet attrs) {
if (attrs != null) {
String packageName = "http://schemas.android.com/apk/res-auto";
mUrl = attrs.getAttributeValue(packageName, "url");
mFetchAutomatically = attrs.getAttributeBooleanValue(packageName, "fetchAutomatically", false);
}
}

Do whatever is needed with it. That’s already it.

 

I hope you enjoyed this post. Please feel free to ask anything you want in the comments.

And remember: Sharing is caring!

Annual income report: 2011

It has not been one year since I started publishing Android income reports, but it has been far more than a year since I released my first app to the Android market, so it’s time to for my first annual report. It is structured the same way my monthly reports are but with a little more detail on certain aspects.

For all my income reports, please click here.

Which Apps?

3D Invaders – about 167,000 downloads

AL Voice Recorder – about 538,000 downloads

AL Voice Recorder Ad Free – 853 downloads

Droid-Blog.net Android App – 370 downloads

SmsToSpeech full – 722 downloads

Unfortunately I have no numbers of my app’s last years downloads, but this will sure change next year. What might  be interesting to you is that all the above apps were published in 2010.

What did I do?

I made improvements on my apps, added great features and completely reworked the internals of the AL Voice Recorder. I did some App Store Optimization but invested also a lot of time into ANDLABS, the Android development company I cofounded.

Advertising Stats

Here are some statistics from the two advertising networks I’m using, AdMob and Madvertise. Please read my second income report for an explanation of the following numbers.

AdMob:

Requests: 6,539,380

Impressions: 6,339,677

Fill Rate: 96.95%

Clicks: 151,543

CTR: 2.39%

eCPM: $1.06

House Ads: 3,201,330

House Ad Clicks: 33,007

House Ad CTR: 1,03%

Adjusted Requests:  9,740,710

Adjusted Fill Rate: 65.01%

Now what’s pretty interesting here is the house Ads. When you have been following my income report series, you probably saw that my house ad requests were close to zero in the last months. This means that, in the beginning of 2011, AdMob had far less ads to serve than they have now.

Madvertise

As I’m not using house ads in madvertise, no adjusted requests and fill rates are shown here.

Requests: 4,819,463

Impressions: 917,899

Fill Rate: 19.05%

Clicks: 43,989

CTR: 4.79%

eCPM: $8.75

When you took a look at my last monthly income report, you will notice that about a quarter of my requests and impressions on madvertise were generated in December. This truly was an awesome month!

How much?

Here we go.

Madvertise:

3D Invaders: ~$6,750.41

AL Voice Recorder: ~$1,292.61

madvertise Total: ~$8043,02

AdMob:

3D Invaders: $2,089.43

AL Voice Recorder: $4,601.90

AdMob Total: $6,691.25

Market sales (includes In-App purchases): ~$1,595.82

Total: ~$16,330.09

That’s an average of $1,360.85 per month. Nothing one could live of in a city as expensive as Munich but, since this were only my private apps, still a satisfying result.

Analysis

Let’s analyze this a bit. A pretty interesting thing is the development of my impressions vs. my income on AdMob. Let’s look at some graphs:

AdMob impressions 2011

AdMob impressions 2011

AdMob income 2011

AdMob income 2011

As you can see, my impressions and my income totaly don’t fit at the beginning of the year. However, when taking a look at my eCPM, this correlates pretty good:

AdMob eCPM 2011

AdMob eCPM 2011

While I had lots of impressions at the beginning of the year, the eCPM AdMob provided at the end of 2011 was able to top the results of that period by several 100%.

With madvertise, I had a similar szenario income wise. As I wrote above, I made most of my impressions in the last month(s) of this year, same with my revenue:

madvertise income 2011

madvertise income 2011

 

What’s next?

For this year I’m planing to release some awesome apps and hence want to make an awesome income. This is why my goal for this year is to have one month with an income of at least $10,000. I hope this will work out.

Please feel free to share your own experiences, hints and opinions in the comments. Please also don’t hesitate to tell me if there is anything else you’d like to get some information about.

© 2024 Droid-Blog

Theme by Anders NorenUp ↑