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.
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();
}
}
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
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.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
Thank you very much for this code!
I'm new to java and android. I tried call this method with a button:
it doesn't work. could you help me? how can I call this method with a button?
Thank you very much kmartinho8
kmartinho8, not sure exactly whats not working. You could try fixing this line: AppRater.showRateDialog(YourActivity.this, null);
Also, wrap that line in these lines: runOnUiThread(new Runnable() {
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!
Thanks for post this, Is this a problem with the emulator that it can not actually launch a web page?
This is indeed a good site, I will tell my good friend http://www.kajoinhk.com/
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.
I'll try to the add apprater functionality it to my published app as part of an upgrade tomorrow.
thanks very much for this! Ill use it in my own app :D
Could you specify under witch license this code was published?
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 ?
Will this work with Live wallpapers?
Thanx dude :)
Use
Otherwise you will get:
thnx a lot :) keep posting more....
Well actually I dont understand this line clearly:
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?
well your Code needs this line to work as a normal, inshowRateDialog
Great post!
you can use the code below to run it in the emulator or open it in the browser
hello , I want I want to show this dialog in the fifth launch without specification on the day . How can I do it ?
I would recommend set launch count to 0 if user clicks Remind me later button. Enter following just before dismiss()
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?
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 . ......
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?
Great!!!Thx!
NewsMint - Stock Prediction & Finance News iPhone App https://itunes.apple.com/us/app/newsmint-stock-prediction/id901813840?mt=8
editor.putLong("date_firstlaunch", date_firstLaunch+DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000); editor.commit(); before showratedialog()