How to implement Rate It feature in Android App

前端 未结 14 1358
囚心锁ツ
囚心锁ツ 2020-12-02 04:19

I am developing an Android App. In which everything is working right. My app is ready to launch. But there I need to implement one more feature. I need to display a popup wh

相关标签:
14条回答
  • 2020-12-02 04:45

    My one using DialogFragment:

    public class RateItDialogFragment extends DialogFragment {
        private static final int LAUNCHES_UNTIL_PROMPT = 10;
        private static final int DAYS_UNTIL_PROMPT = 3;
        private static final int MILLIS_UNTIL_PROMPT = DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000;
        private static final String PREF_NAME = "APP_RATER";
        private static final String LAST_PROMPT = "LAST_PROMPT";
        private static final String LAUNCHES = "LAUNCHES";
        private static final String DISABLED = "DISABLED";
    
        public static void show(Context context, FragmentManager fragmentManager) {
            boolean shouldShow = false;
            SharedPreferences sharedPreferences = getSharedPreferences(context);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            long currentTime = System.currentTimeMillis();
            long lastPromptTime = sharedPreferences.getLong(LAST_PROMPT, 0);
            if (lastPromptTime == 0) {
                lastPromptTime = currentTime;
                editor.putLong(LAST_PROMPT, lastPromptTime);
            }
    
            if (!sharedPreferences.getBoolean(DISABLED, false)) {
                int launches = sharedPreferences.getInt(LAUNCHES, 0) + 1;
                if (launches > LAUNCHES_UNTIL_PROMPT) {
                    if (currentTime > lastPromptTime + MILLIS_UNTIL_PROMPT) {
                        shouldShow = true;
                    }
                }
                editor.putInt(LAUNCHES, launches);
            }
    
            if (shouldShow) {
                editor.putInt(LAUNCHES, 0).putLong(LAST_PROMPT, System.currentTimeMillis()).commit();
                new RateItDialogFragment().show(fragmentManager, null);
            } else {
                editor.commit();
            }
        }
    
        private static SharedPreferences getSharedPreferences(Context context) {
            return context.getSharedPreferences(PREF_NAME, 0);
        }
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            return new AlertDialog.Builder(getActivity())
                    .setTitle(R.string.rate_title)
                    .setMessage(R.string.rate_message)
                    .setPositiveButton(R.string.rate_positive, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + getActivity().getPackageName())));
                            getSharedPreferences(getActivity()).edit().putBoolean(DISABLED, true).commit();
                            dismiss();
                        }
                    })
                    .setNeutralButton(R.string.rate_remind_later, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dismiss();
                        }
                    })
                    .setNegativeButton(R.string.rate_never, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            getSharedPreferences(getActivity()).edit().putBoolean(DISABLED, true).commit();
                            dismiss();
                        }
                    }).create();
        }
    }
    

    Then use it in onCreate() of your main FragmentActivity:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
    
        RateItDialogFragment.show(this, getFragmentManager());
    
    }
    
    0 讨论(0)
  • 2020-12-02 04:45

    AndroidRate is a library to help you promote your android app by prompting users to rate the app after using it for a few days.

    Module Gradle:

    dependencies {
      implementation 'com.vorlonsoft:androidrate:1.0.8'
    }
    

    MainActivity.java:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
    
      AppRate.with(this)
          .setStoreType(StoreType.GOOGLEPLAY) //default is GOOGLEPLAY (Google Play), other options are
                                              //           AMAZON (Amazon Appstore) and
                                              //           SAMSUNG (Samsung Galaxy Apps)
          .setInstallDays((byte) 0) // default 10, 0 means install day
          .setLaunchTimes((byte) 3) // default 10
          .setRemindInterval((byte) 2) // default 1
          .setRemindLaunchTimes((byte) 2) // default 1 (each launch)
          .setShowLaterButton(true) // default true
          .setDebug(false) // default false
          //Java 8+: .setOnClickButtonListener(which -> Log.d(MainActivity.class.getName(), Byte.toString(which)))
          .setOnClickButtonListener(new OnClickButtonListener() { // callback listener.
              @Override
              public void onClickButton(byte which) {
                  Log.d(MainActivity.class.getName(), Byte.toString(which));
              }
          })
          .monitor();
    
      if (AppRate.with(this).getStoreType() == StoreType.GOOGLEPLAY) {
          //Check that Google Play is available
          if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) != ConnectionResult.SERVICE_MISSING) {
              // Show a dialog if meets conditions
              AppRate.showRateDialogIfMeetsConditions(this);
          }
      } else {
          // Show a dialog if meets conditions
          AppRate.showRateDialogIfMeetsConditions(this);
      }
    }
    

    The default conditions to show rate dialog is as below:

    1. App is launched more than 10 days later than installation. Change via AppRate#setInstallDays(byte).
    2. App is launched more than 10 times. Change via AppRate#setLaunchTimes(byte).
    3. App is launched more than 1 days after neutral button clicked. Change via AppRate#setRemindInterval(byte).
    4. App is launched X times and X % 1 = 0. Change via AppRate#setRemindLaunchTimes(byte).
    5. App shows neutral dialog (Remind me later) by default. Change via setShowLaterButton(boolean).
    6. To specify the callback when the button is pressed. The same value as the second argument of DialogInterface.OnClickListener#onClick will be passed in the argument of onClickButton.
    7. Setting AppRate#setDebug(boolean) will ensure that the rating request is shown each time the app is launched. This feature is only for development!.

    Optional custom event requirements for showing dialog

    You can add additional optional requirements for showing dialog. Each requirement can be added/referenced as a unique string. You can set a minimum count for each such event (for e.g. "action_performed" 3 times, "button_clicked" 5 times, etc.)

    AppRate.with(this).setMinimumEventCount(String, short);
    AppRate.with(this).incrementEventCount(String);
    AppRate.with(this).setEventCountValue(String, short);
    

    Clear show dialog flag

    When you want to show the dialog again, call AppRate#clearAgreeShowDialog().

    AppRate.with(this).clearAgreeShowDialog();
    

    When the button presses on

    call AppRate#showRateDialog(Activity).

    AppRate.with(this).showRateDialog(this);
    

    Set custom view

    call AppRate#setView(View).

    LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.custom_dialog, (ViewGroup)findViewById(R.id.layout_root));
    AppRate.with(this).setView(view).monitor();
    

    Specific theme

    You can use a specific theme to inflate the dialog.

    AppRate.with(this).setThemeResId(int);
    

    Custom dialog

    If you want to use your own dialog labels, override string xml resources on your application.

    <resources>
        <string name="rate_dialog_title">Rate this app</string>
        <string name="rate_dialog_message">If you enjoy playing this app, would you mind taking a moment to rate it? It won\'t take more than a minute. Thanks for your support!</string>
        <string name="rate_dialog_ok">Rate It Now</string>
        <string name="rate_dialog_cancel">Remind Me Later</string>
        <string name="rate_dialog_no">No, Thanks</string>
    </resources>
    

    Check that Google Play is available

    if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) != ConnectionResult.SERVICE_MISSING) {
    
    }
    
    0 讨论(0)
  • 2020-12-02 04:48

    Java & Kotlin solution (In-app review API by Google in 2020):

    First, in your build.gradle(app) file, add following dependencies (full setup here)

    dependencies {
        // This dependency is downloaded from the Google’s Maven repository.
        // So, make sure you also include that repository in your project's build.gradle file.
        implementation 'com.google.android.play:core:1.8.0'
    }
    

    Add this method to your Activity:

    void askRatings() {
        ReviewManager manager = ReviewManagerFactory.create(this);
        Task<ReviewInfo> request = manager.requestReviewFlow();
        request.addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                // We can get the ReviewInfo object
                ReviewInfo reviewInfo = task.getResult();
                Task<Void> flow = manager.launchReviewFlow(this, reviewInfo);
                flow.addOnCompleteListener(task2 -> {
                    // The flow has finished. The API does not indicate whether the user
                    // reviewed or not, or even whether the review dialog was shown. Thus, no
                    // matter the result, we continue our app flow.
                });
            } else {
                // There was some problem, continue regardless of the result.
            }
        });
    }
    

    Call it like any other method:

    askRatings();
    

    Kotlin code can be found here

    0 讨论(0)
  • 2020-12-02 04:48

    I'm using this easy solution. You can just add this library with gradle: https://github.com/fernandodev/easy-rating-dialog

    compile 'com.github.fernandodev.easyratingdialog:easyratingdialog:+'
    
    0 讨论(0)
  • 2020-12-02 04:54

    As you see from the other post you have linked, there isn't a way for the app to know if the user has left a review or not. And for good reason.

    Think about it, if an app could tell if the user has left a review or not, the developer could restrict certain features that would only be unlocked if the user leaves a 5/5 rating. This would lead the other users of Google Play to not trust the reviews and would undermine the rating system.

    The alternative solutions I have seen is that the app reminds the user to submit a rating whenever the app is opened a specific number of times, or a set interval. For example, on every 10th time the app is opened, ask the user to leave a rating and provide a "already done" and "remind me later" button. Keep showing this message if the user has chosen to remind him/her later. Some other apps developers show this message with an increasing interval (like, 5, 10, 15nth time the app is opened), because if a user hasn't left a review on the, for example, 100th time the app was opened, it's probably likely s/he won't be leaving one.

    This solution isn't perfect, but I think it's the best you have for now. It does lead you to trust the user, but realize that the alternative would mean a potentially worse experience for everyone in the app market.

    0 讨论(0)
  • 2020-12-02 04:55

    As of August 2020, Google Play's In-App Review API is available and its straightforward implementation is correct as per this answer.

    But if you wish add some display logic on top of it, use the Five-Star-Me library.

    Set launch times and install days in the onCreate method of the MainActivity to configure the library.

      FiveStarMe.with(this)
          .setInstallDays(0) // default 10, 0 means install day.
          .setLaunchTimes(3) // default 10
          .setDebug(false) // default false
          .monitor();
    

    Then place the below method call on any activity / fragment's onCreate / onViewCreated method to show the prompt whenever the conditions are met.

    FiveStarMe.showRateDialogIfMeetsConditions(this); //Where *this* is the current activity.
    

    Installation instructions:

    You can download from jitpack.

    Step 1: Add this to project (root) build.gradle.

    allprojects {
      repositories {
        ...
        maven { url 'https://jitpack.io' }
      }
    }
    

    Step 2: Add the following dependency to your module (app) level build.gradle.

    dependencies {
      implementation 'com.github.numerative:Five-Star-Me:2.0.0'
    }
    
    
    0 讨论(0)
提交回复
热议问题