55

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?

Keith Adler
  • 20,230
  • 24
  • 116
  • 184
  • 2
    The 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 Answers9

82

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();        
    }
}
pna
  • 5,282
  • 2
  • 19
  • 36
marchica
  • 2,106
  • 21
  • 21
  • Yes I ended up finding this code snippet as well. – Keith Adler Aug 04 '11 at 14:32
  • 6
    Great 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
  • 2
    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` – Pratik Butani Jan 31 '14 at 12:23
  • 2
    Don'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
    The link is down. Can someone post the code? –  Mar 14 '15 at 06:00
  • @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
  • 4
    It is unfair for this to have 58 votes and no answer is available. The link above is broken. :( – Madona Syombua Sep 01 '15 at 13:36
  • code snippet not found, please update your answer – Bibaswann Bandyopadhyay Oct 12 '15 at 16:10
  • @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
  • 1
    There 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); – smitty1 Feb 16 '19 at 21:55
38
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);
}
Mohd Mufiz
  • 2,176
  • 15
  • 28
8

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

nspo
  • 1,236
  • 14
  • 20
3

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)));
Andrew Barber
  • 37,547
  • 20
  • 91
  • 118
Pir Fahim Shah
  • 9,541
  • 1
  • 73
  • 71
  • 1
    Please do not continue to make your posts with the entire text in **bold** like that. – Andrew Barber Nov 13 '12 at 15:44
  • 1
    Okay, actually i want dt user could easily find his/her solution quickly, – Pir Fahim Shah Nov 13 '12 at 15:47
  • 5
    The 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
3

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.

World Engineer
  • 320
  • 8
  • 20
0

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/

Justin Morgan
  • 27,557
  • 11
  • 71
  • 100
vineet
  • 47
  • 2
  • 1
    This 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
0

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

Mina Fawzy
  • 18,268
  • 13
  • 118
  • 129
0

I think, redirecting users to your app's web page is the only solution here.

Egor
  • 37,239
  • 10
  • 109
  • 127
-1

In any event :eg button

              Intent intent = new Intent(Intent.ACTION_VIEW);
              intent.setData
              (Uri.parse("market://details?id="+context.getPackageName()));
              startActivity(intent);
Ram
  • 1,908
  • 3
  • 20
  • 30