Is there a best practice approach to prompt Android users to rate your application? Considering they could acquire it from Amazon.com or Google Marketplace what is the best route to handle this in a way that allows users to vote?
-
2The easiest approach is to add a `public static final` field to one of your classes indicating if the APK is for Google Play, Amazon etc. Based on that constant, you can then create the correct URI and use a library like mine here to let users rate: https://github.com/marcow/AppRater – caw Jul 31 '13 at 03:56
-
See similar question: http://stackoverflow.com/questions/10816757/rate-this-app-link-in-google-play-store-app-on-the-phone – AlikElzin-kilaka Dec 22 '13 at 10:34
-
You can use library https://github.com/Vorlonsoft/AndroidRate (`implementation 'com.vorlonsoft:androidrate:1.0.3'`) with `.setStoreType(StoreType.GOOGLEPLAY)` or `.setStoreType(StoreType.AMAZON)` – Alexander Savin Nov 08 '17 at 04:25
9 Answers
For Google Marketplace, take a look at this neat code snippet. I'm sure you can modify it to launch the Amazon Appstore instead or in addition to.
EDIT: Looks like the site changed their URL structure so I've updated the link above so it works now. Here is an old copy at the Wayback Machine in case their site goes down again. I will paste the main contents of the post below as an additional backup but you still might want to visit the link to read the comments and get any updates.
This code prompts engaged users to rate your app in the Android market (inspired by iOS Appirater). 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 appearance, 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 dialog
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();
}
}
-
-
6Great code - just note that it does not set a flag to stop reminding the user once they have clicked the "Rate" button. Just add this to the onClick() for the rate button and you should be all set: `if (editor != null) { editor.putBoolean("dontshowagain", true); editor.commit(); }` – bkurzius Jan 28 '14 at 14:30
-
2Use `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` – Pratik Butani Jan 31 '14 at 12:23
-
2Don't forget to clear shared preferences when "Remind me later" button is clicked, so as to reset all the values and so that the dialog will be prompted again after set intervals. Here is the code that you need to put in onClick() of "Remind me later" if (editor != null) {editor.clear().commit();} – Melbourne Lopes Apr 26 '14 at 14:45
-
9
-
@user4652595 I'd rather not post the code as it's a lot, it can be edited on that site (and likely has changed over the years), and the comments seem to be helpful too. The link seems to be working right now, but if it's still down for you, you can always view the cached version on Google or my favorite trick is to use the Internet Archive's [Wayback Machine](https://archive.org/web/). – marchica Mar 17 '15 at 21:45
-
4It is unfair for this to have 58 votes and no answer is available. The link above is broken. :( – Madona wambua Sep 01 '15 at 13:36
-
-
@marchica Does it show the dialog each time the user open the app after 3 days of the launch?? – KJEjava48 Mar 14 '17 at 05:59
-
1There is a small flaw with this answer. Because onCreate is called with every configuration change (i.e. screen rotation) each screen rotation or other configuration change registers as an app launch. To avoid this, check savedInstanceState before calling the app_launched() method. i.e. if(savedInstanceState == null) AppRater.app_launched(this); – jwitt98 Feb 16 '19 at 21:55
Uri uri = Uri.parse("market://details?id=" + context.getPackageName());
Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
try {
context.startActivity(goToMarket);
} catch (ActivityNotFoundException e) {
UtilityClass.showAlertDialog(context, ERROR, "Couldn't launch the Google Playstore app", null, 0);
}

- 2,236
- 17
- 28
You could also use RateMeMaybe: https://github.com/Kopfgeldjaeger/RateMeMaybe
It gives you quite some options to configure (minimum of days/launches until first prompt, minimum of days/launches until each next prompt if user chooses "not now", dialog title, message etc.). It is also easy to use.
Example usage from README:
RateMeMaybe rmm = new RateMeMaybe(this);
rmm.setPromptMinimums(10, 14, 10, 30);
rmm.setDialogMessage("You really seem to like this app, "
+"since you have already used it %totalLaunchCount% times! "
+"It would be great if you took a moment to rate it.");
rmm.setDialogTitle("Rate this app");
rmm.setPositiveBtn("Yeeha!");
rmm.run();
Edit: If you want to only show the prompt manually, you can also just use the RateMeMaybeFragment
if (mActivity.getSupportFragmentManager().findFragmentByTag(
"rmmFragment") != null) {
// the dialog is already shown to the user
return;
}
RateMeMaybeFragment frag = new RateMeMaybeFragment();
frag.setData(getIcon(), getDialogTitle(), getDialogMessage(),
getPositiveBtn(), getNeutralBtn(), getNegativeBtn(), this);
frag.show(mActivity.getSupportFragmentManager(), "rmmFragment");
getIcon() can be replaced with 0 if you don't want to use one; the rest of the getX calls can be replaced with Strings
Changing the code to open the Amazon Marketplace should be easy

- 1,488
- 16
- 21
Just write these two lines of code under your "Rank this Apps" button and it will take you to the Google store where you have uploaded your app.
String myUrl ="https://play.google.com/store/apps/details?id=smartsilencer";
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(myUrl)));

- 39,603
- 20
- 94
- 123

- 10,505
- 1
- 82
- 81
-
1Please do not continue to make your posts with the entire text in **bold** like that. – Andrew Barber Nov 13 '12 at 15:44
-
1Okay, actually i want dt user could easily find his/her solution quickly, – Pir Fahim Shah Nov 13 '12 at 15:47
-
5The OP found their solution already over a year ago. It's not at all appropriate to post **your whole post** in bold to try to make it seen before other people's posts are. Have you noticed that no one has been up-voting your posts since your first two? And this one was up-voted *before* you added the 'bold' text to it? – Andrew Barber Nov 13 '12 at 15:48
Maybe set up a Facebook link to a fan page with "like" options and so forth? An icon with a small label on the main menu would nicely sufficient and not as annoying, if at all, as a pop up reminder.
Play store policy says that if we notify users to perform some action in our app, then we must also let users cancel the operation if the user doesn’t want to perform that action. So if we ask users to update the app or rate the app on the Play store with Yes(Now), then we must also give an option for No(Later, Not Now), etc.
rateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
r.showDefaultDialog();
}
});
where r is a class which contain showDefaultDialog method
public void showDefaultDialog() {
//Log.d(TAG, "Create default dialog.");
String title = "Enjoying Live Share Tips?";
String loveit = "Love it";
String likeit = "Like it";
String hateit = "Hate it";
new AlertDialog.Builder(hostActivity)
.setTitle(title)
.setIcon(R.drawable.ic_launcher)
//.setMessage(message)
.setPositiveButton(hateit, this)
.setNegativeButton(loveit, this)
.setNeutralButton(likeit, this)
.setOnCancelListener(this)
.setCancelable(true)
.create().show();
}
To download a full example[androidAone]:http://androidaone.com/11-2014/notify-users-rate-app-playstore/

- 30,035
- 12
- 80
- 104

- 47
- 2
-
1This doesn't really answer the original question which asks abut 'Best Practise' rather then 'Code to do this'. – HDCerberus Dec 26 '14 at 14:13
for simple solution try this library https://github.com/kobakei/Android-RateThisApp
you can also change its configuration like criteria to show dialog , title , message

- 20,852
- 17
- 133
- 156
I think, redirecting users to your app's web page is the only solution here.

- 39,695
- 10
- 113
- 130
In any event :eg button
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData
(Uri.parse("market://details?id="+context.getPackageName()));
startActivity(intent);

- 1,948
- 3
- 21
- 31