Prompt engaged users to rate your app in the Android market (AppiRater)

25 votes · 28 comments

This code prompts engaged users to rate your app in the Android market (inspired by iOS Appirater [2]). It requires a certain number of launches of the app and days since the installation before the rating dialog appears.

Adjust APP_TITLE and APP_PNAME to your needs. You should also tweak DAYS_UNTIL_PROMPT and LAUNCHES_UNTIL_PROMPT.

To test it and to tweak the dialog appearence, you can call AppRater.showRateDialog(this, null) from your Activity. Normal use is to invoke AppRater.app_launched(this) each time your activity is invoked (eg. from within the onCreate method). If all conditions are met, the dialog appears.

raw ·
copy
· download
public class AppRater { private final static String APP_TITLE = "YOUR-APP-NAME"; private final static String APP_PNAME = "YOUR-PACKAGE-NAME"; private final static int DAYS_UNTIL_PROMPT = 3; private final static int LAUNCHES_UNTIL_PROMPT = 7; public static void app_launched(Context mContext) { SharedPreferences prefs = mContext.getSharedPreferences("apprater", 0); if (prefs.getBoolean("dontshowagain", false)) { return ; } SharedPreferences.Editor editor = prefs.edit(); // Increment launch counter long launch_count = prefs.getLong("launch_count", 0) + 1; editor.putLong("launch_count", launch_count); // Get date of first launch Long date_firstLaunch = prefs.getLong("date_firstlaunch", 0); if (date_firstLaunch == 0) { date_firstLaunch = System.currentTimeMillis(); editor.putLong("date_firstlaunch", date_firstLaunch); } // Wait at least n days before opening if (launch_count >= LAUNCHES_UNTIL_PROMPT) { if (System.currentTimeMillis() >= date_firstLaunch + (DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000)) { showRateDialog(mContext, editor); } } editor.commit(); } public static void showRateDialog(final Context mContext, final SharedPreferences.Editor editor) { final Dialog dialog = new Dialog(mContext); dialog.setTitle("Rate " + APP_TITLE); LinearLayout ll = new LinearLayout(mContext); ll.setOrientation(LinearLayout.VERTICAL); TextView tv = new TextView(mContext); tv.setText("If you enjoy using " + APP_TITLE + ", please take a moment to rate it. Thanks for your support!"); tv.setWidth(240); tv.setPadding(4, 0, 4, 10); ll.addView(tv); Button b1 = new Button(mContext); b1.setText("Rate " + APP_TITLE); b1.setOnClickListener(new OnClickListener() { public void onClick(View v) { mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + APP_PNAME))); dialog.dismiss(); } }); ll.addView(b1); Button b2 = new Button(mContext); b2.setText("Remind me later"); b2.setOnClickListener(new OnClickListener() { public void onClick(View v) { dialog.dismiss(); } }); ll.addView(b2); Button b3 = new Button(mContext); b3.setText("No, thanks"); b3.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (editor != null) { editor.putBoolean("dontshowagain", true); editor.commit(); } dialog.dismiss(); } }); ll.addView(b3); dialog.setContentView(ll); dialog.show(); } }
Add a comment

28 Comments

thanks for posting this, I had been wondering how to do this.

I have a problem exercising this code in the emulator. when selecting the "Rate MyApp" button on the pop up, the activity does a force close. I tried using the URI for a published app, with the same result.

Is this a problem with the emulator that it can not actually launch a web page?

the other two buttons perform as expected and I have checked the apprater.xml file created in the shared_prefs directory and it seems to increment the launch_count variable correctly and to set the date_first_launch variable to the correct epoch date.

thanks, Alex

Reply · March 26, 2011, 10:45 a.m.

It doesn't work in the emulator because it doesn't have the Android market (it wants to open the URI "market://details?id=" + APP_PNAME). Try the code on a real phone or an emulator with market installed.

Reply · March 26, 2011, 4:08 p.m.

yup, that did it, makes total sense that it couldn't work with out the market app present on the emulator.

I have apprater integrated into just a hello world app, so naturally the market could not find it. I'll try to the add apprater functionality it to my published app as part of an upgrade tomorrow.

thanks again for the neat code snippet and also the pointer to what I was overlooking.

Alex

Reply · March 27, 2011, 1:59 a.m.

Thank you very much for this code!

I'm new to java and android. I tried call this method with a button:

    Button brate_button = (Button) findViewById(R.id.rate_app_button);
    brate_button.setOnClickListener(new View.OnClickListener() {
       public void onClick(View arg0) {
           AppRater.showRateDialog(this, null);;
       } 
    });

it doesn't work. could you help me? how can I call this method with a button?

Thank you very much kmartinho8

Reply · Dec. 29, 2011, 10:02 a.m.

kmartinho8, not sure exactly whats not working. You could try fixing this line: AppRater.showRateDialog(YourActivity.this, null);

Reply · Jan. 13, 2012, 10:48 p.m.

Also, wrap that line in these lines: runOnUiThread(new Runnable() {

                @Override
                public void run()
                {
                    // TODO show the dialog

                }
            });
Reply · Jan. 13, 2012, 10:51 p.m.

Nice one! I think once the user clicked the "rate" button, he also doesn't want to see the dialog again, so I added the "dontshowagain" part also in the OnClickListener for b1.

Thanks again!

Reply · Feb. 12, 2012, 9:03 p.m.

Thanks for post this, Is this a problem with the emulator that it can not actually launch a web page?

Reply · March 15, 2012, 10:34 a.m.

This is indeed a good site, I will tell my good friend http://www.kajoinhk.com/

Reply · March 24, 2012, 2:24 a.m.

Thanks for code. Just an addition;

If user clicks "rate this app", the rate dialog will pop up again next time. You should call "editor.putBoolean("dontshowagain", true);" before open store intent.

Reply · May 13, 2012, 4:17 p.m.

I'll try to the add apprater functionality it to my published app as part of an upgrade tomorrow.

Reply · May 21, 2012, 12:16 p.m.

thanks very much for this! Ill use it in my own app :D

Reply · June 21, 2012, 9:50 a.m.

Could you specify under witch license this code was published?

Reply · July 15, 2012, 12:22 p.m.

There is any way to show the Google rate dialog in the play market not my dialog to direct the user to my app in the market then rate my app ?

Reply · Dec. 31, 2012, 8:45 a.m.

Will this work with Live wallpapers?

Reply · Jan. 6, 2013, 11:33 p.m.

Thanx dude :)

Reply · Nov. 23, 2013, 2:41 a.m.

Use

AppRater.showRateDialog(YourActivity.this, null);

Otherwise you will get:

01-31 17:45:18.914: E/AndroidRuntime(16553): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
Reply · Jan. 31, 2014, 12:18 p.m.

thnx a lot :) keep posting more....

Reply · March 2, 2014, 2:59 p.m.

Well actually I dont understand this line clearly:

private final static int DAYS_UNTIL_PROMPT = 3;
private final static int LAUNCHES_UNTIL_PROMPT = 7;

For example I want to show this dialog like this: first launch dont show, after each 5 days later show this dialog continuously

What should I write?

Reply · March 15, 2014, 7:29 a.m.

well your Code needs this line to work as a normal, inshowRateDialog

editor.putLong("date_firstlaunch", 0);
Reply · March 17, 2014, 8:19 a.m.

Great post!

you can use the code below to run it in the emulator or open it in the browser

        try {
                    mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id="+APP_PNAME)));
                } catch (android.content.ActivityNotFoundException anfe) {
                    mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id="+APP_PNAME)));
                }
Reply · April 28, 2014, 11:11 p.m.

hello , I want I want to show this dialog in the fifth launch without specification on the day . How can I do it ?

Reply · June 3, 2014, 1:23 p.m.

I would recommend set launch count to 0 if user clicks Remind me later button. Enter following just before dismiss()

            editor.putLong("launch_count", 0);
            editor.commit();
Reply · June 20, 2014, 4:45 p.m.

I have put it in the main activity's java file, but it has 2 problems:

"The method app_launched cannot be declared static; static methods can only be declared in a static or top level type" AND "The method showRateDialog cannot be declared static; static methods can only be declared in a static or top level type"

What should I do?

Reply · June 27, 2014, 8:50 a.m.

can someone please help me how can i do this : if user press button "No thanks " means user do not want to give rate right now so my target in this case should be to increase the LAUNCHES_UNTIL_PROMPT +=7 ; I HAVE DONE this but my code is not working .and its not showing dialog again after 14 launches . ......

Reply · July 18, 2014, 3:51 a.m.

great posting! can i have a question?

I wanna give some rewards(points in my app) to users who provide rate for my app. is it possible?

Reply · July 24, 2014, 8:39 a.m.

Great!!!Thx!

Reply · July 28, 2014, 7:11 p.m.

NewsMint - Stock Prediction & Finance News iPhone App https://itunes.apple.com/us/app/newsmint-stock-prediction/id901813840?mt=8

Reply · Aug. 28, 2014, 11:17 a.m.

editor.putLong("date_firstlaunch", date_firstLaunch+DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000); editor.commit(); before showratedialog()

Reply · Nov. 9, 2014, 5:57 p.m.