Подтвердить что ты не робот

Как реализовать функцию Rate It в приложении Android

Я разрабатываю приложение для Android. В котором все работает правильно. Мое приложение готово к запуску. Но мне нужно реализовать еще одну функцию. Мне нужно отобразить всплывающее окно, содержащее

Rate It и Remind me later

Здесь, если какая-либо пользовательская скорость приложения на рынке, всплывающее окно не исчезнет. Я искал в Google и нашел ссылку . При этом я понимаю, что его невозможно узнать. Поэтому мне нужно предложение для этого.

Кто-нибудь сталкивался с такой ситуацией раньше? Если да, то есть ли какое-либо решение или любая альтернатива для этого?

4b9b3361

Ответ 1

Я реализовал это некоторое время назад, в некоторой степени. Невозможно узнать, оценил ли пользователь приложение, не позволяя рейтингам стать валютой (некоторые разработчики могут добавить такой вариант, как "Оценить это приложение и получить так и так в приложении бесплатно" ).

Класс, который я написал, содержит три кнопки и настраивает диалоговое окно так, что оно отображается только после того, как приложение было запущено n раз (пользователи имеют более высокий шанс оценить приложение, если они использовали его немного раньше Большинство из них вряд ли даже узнают, что он делает в первом запуске):

public class AppRater {
    private final static String APP_TITLE = "App Name";// App Name
    private final static String APP_PNAME = "com.example.name";// Package Name

    private final static int DAYS_UNTIL_PROMPT = 3;//Min number of days
    private final static int LAUNCHES_UNTIL_PROMPT = 3;//Min number of launches

    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();        
    }
}

Интеграция класса так же просто, как добавление:

AppRater.app_launched(this);

К вашей деятельности. Он должен быть добавлен только к одной активности во всем приложении.

Ответ 3

Мой, используя 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();
    }
}

Затем используйте его в onCreate() вашей основной функции FragmentActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...

    RateItDialogFragment.show(this, getFragmentManager());

}

Ответ 4

Используйте эту библиотеку, это просто и просто.. https://github.com/hotchemi/Android-Rate

добавив зависимость.

dependencies {
  compile 'com.github.hotchemi:android-rate:0.5.6'
}

Ответ 5

Я думаю, что вы пытаетесь сделать, вероятно, контрпродуктивно.

Легко для людей оценивать приложения, как правило, хорошая идея, так как большинство людей это беспокоит, потому что им нравится приложение. Ходят слухи, что количество рейтингов влияет на ваш рыночный рейтинг (хотя я мало свидетельствую об этом). Включение пользователей в рейтинг - через экраны скриншотов - скорее всего, заставит людей очистить наг, оставив плохой рейтинг.

Добавление возможности напрямую оценивать приложение вызвало небольшое снижение числовых оценок для моей бесплатной версии и небольшое увеличение моего платного приложения. Для бесплатного приложения мои рейтинги 4 звезды увеличились больше, чем мои 5-звездочные рейтинги, так как люди, которые думали, что мое приложение было хорошим, но не очень хорошим, тоже оценили его. Изменение было около -0.2. Для платных изменений было около +0.1. Я должен удалить его из бесплатной версии, за исключением того, что мне нравится получать много комментариев.

Я помещаю свою кнопку рейтинга в экран настроек (предпочтений), где это не влияет на нормальную работу. Он по-прежнему увеличивал мою рейтинговую ставку в 4 или 5 раз. Я не сомневаюсь, что если бы я попытался подтолкнуть моих пользователей к составлению рейтинга, я бы получил много пользователей, давших мне плохие оценки в знак протеста.

Ответ 6

Я использую это простое решение. Вы можете просто добавить эту библиотеку с помощью gradle: https://github.com/fernandodev/easy-rating-dialog

compile 'com.github.fernandodev.easyratingdialog:easyratingdialog:+'

Ответ 7

Это решение очень похоже на приведенное выше. Единственное различие заключается в том, что вы сможете отложить подсказку в диалоговом окне рейтинга за кадры и дни. Если напомнить мне позже нажмите кнопку, то я задержу всплывающее окно в течение 3 дней и 10 запусков. То же самое делается для тех, кто выбран для оценки, однако задержки длиннее (чтобы не беспокоить пользователя так скоро, в случае, если он действительно оценил приложение. Это можно изменить, чтобы не отображаться снова, тогда вам придется измените код на свой вкус). Надеюсь, это поможет кому-то!

public class AppRater {
    private final static String APP_TITLE = "your_app_name";
    private static String PACKAGE_NAME = "your_package_name";
    private static int DAYS_UNTIL_PROMPT = 5;
    private static int LAUNCHES_UNTIL_PROMPT = 10;
    private static long EXTRA_DAYS;
    private static long EXTRA_LAUCHES;
    private static SharedPreferences prefs;
    private static SharedPreferences.Editor editor;
    private static Activity activity;

    public static void app_launched(Activity activity1) {
        activity = activity1;

        Configs.sendScreenView("Avaliando App", activity);

        PACKAGE_NAME = activity.getPackageName();

        prefs = activity.getSharedPreferences("apprater", Context.MODE_PRIVATE);
        if (prefs.getBoolean("dontshowagain", false)) 
            return;

        editor = prefs.edit();

        EXTRA_DAYS = prefs.getLong("extra_days", 0);
        EXTRA_LAUCHES = prefs.getLong("extra_launches", 0);

        // 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 + EXTRA_LAUCHES))
            if (System.currentTimeMillis() >= date_firstLaunch + (DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000) + EXTRA_DAYS)
                showRateDialog();

        editor.commit();
    }   

    public static void showRateDialog() {
        final Dialog dialog = new Dialog(activity);
        dialog.setTitle("Deseja avaliar o aplicativo " + APP_TITLE + "?");

        LinearLayout ll = new LinearLayout(activity);
        ll.setOrientation(LinearLayout.VERTICAL);
        ll.setPadding(5, 5, 5, 5);

        TextView tv = new TextView(activity);
        tv.setTextColor(activity.getResources().getColor(R.color.default_text));
        tv.setText("Ajude-nos a melhorar o aplicativo com sua avaliação no Google Play!");
        tv.setWidth(240);
        tv.setGravity(Gravity.CENTER);
        tv.setPadding(5, 5, 5, 5);
        ll.addView(tv);

        Button b1 = new Button(activity);
        b1.setTextColor(activity.getResources().getColor(R.color.default_text));
        b1.setBackground(activity.getResources().getDrawable(R.drawable.rounded_blue_box));
        b1.setTextColor(Color.WHITE);
        b1.setText("Avaliar aplicativo " + APP_TITLE + "!");
        b1.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Configs.sendHitEvents(Configs.APP_RATER, Configs.CATEGORIA_ANALYTICS, "Clique", "Avaliar", activity);

                activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + PACKAGE_NAME)));
                delayDays(60);
                delayLaunches(30);
                dialog.dismiss();
            }
        });        
        ll.addView(b1);
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) b1.getLayoutParams();
        params.setMargins(5, 3, 5, 3);
        b1.setLayoutParams(params);

        Button b2 = new Button(activity);
        b2.setTextColor(activity.getResources().getColor(R.color.default_text));
        b2.setBackground(activity.getResources().getDrawable(R.drawable.rounded_blue_box));
        b2.setTextColor(Color.WHITE);
        b2.setText("Lembre-me mais tarde!");
        b2.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Configs.sendHitEvents(Configs.APP_RATER, Configs.CATEGORIA_ANALYTICS, "Clique", "Avaliar Mais Tarde", activity);
                delayDays(3);
                delayLaunches(10);
                dialog.dismiss();
            }
        });
        ll.addView(b2);
        params = (LinearLayout.LayoutParams) b2.getLayoutParams();
        params.setMargins(5, 3, 5, 3);
        b2.setLayoutParams(params);

        Button b3 = new Button(activity);
        b3.setTextColor(activity.getResources().getColor(R.color.default_text));
        b3.setBackground(activity.getResources().getDrawable(R.drawable.rounded_blue_box));
        b3.setTextColor(Color.WHITE);
        b3.setText("Não, obrigado!");
        b3.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Configs.sendHitEvents(Configs.APP_RATER, Configs.CATEGORIA_ANALYTICS, "Clique", "Não Avaliar", activity);

                if (editor != null) {
                    editor.putBoolean("dontshowagain", true);
                    editor.commit();
                }
                dialog.dismiss();
            }
        });
        ll.addView(b3);
        params = (LinearLayout.LayoutParams) b3.getLayoutParams();
        params.setMargins(5, 3, 5, 0);
        b3.setLayoutParams(params);

        dialog.setContentView(ll);        
        dialog.show();        
    }

    private static void delayLaunches(int numberOfLaunches) {
        long extra_launches = prefs.getLong("extra_launches", 0) + numberOfLaunches;
        editor.putLong("extra_launches", extra_launches);
        editor.commit();
    }

    private static void delayDays(int numberOfDays) {
        Long extra_days = prefs.getLong("extra_days", 0) + (numberOfDays * 1000 * 60 * 60 * 24);
        editor.putLong("extra_days", extra_days);
        editor.commit();
    }
}

Кнопки имеют определенный цвет и фон. Фон как показано в этом XML файле:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:padding="10dp"
    android:shape="rectangle" >

    <solid android:color="#2E78B9" />

    <corners
        android:bottomLeftRadius="6dp"
        android:bottomRightRadius="6dp"
        android:topLeftRadius="6dp"
        android:topRightRadius="6dp" />

</shape>

source: Android-подход для "Оценить мое приложение"

Ответ 8

Как вы видите из другого сообщения, которое вы связали, у приложения нет способа узнать, оставил ли пользователь отзыв или нет. И не зря.

Подумайте об этом, если приложение может узнать, оставил ли пользователь отзыв или нет, разработчик может ограничить некоторые функции, которые будут разблокированы, только если пользователь оставит 5/5 рейтинга. Это заставит других пользователей Google Play не доверять отзывам и подорвет систему рейтинга.

Альтернативные решения, которые я видел, это то, что приложение напоминает пользователю представлять рейтинг, когда приложение открывается определенное количество раз или заданный интервал. Например, каждый десятый раз приложение открывается, попросите пользователя оставить рейтинг и предоставить кнопку "уже сделано" и "напомнить мне позже". Продолжайте показывать это сообщение, если пользователь решил напомнить ему позже. Некоторые другие разработчики приложений показывают это сообщение с увеличением интервала (например, 5, 10, 15-й раз, когда приложение открыто), потому что, если пользователь не оставил обзор, например, в 100-й раз, когда приложение было открыто, оно вероятно, он/она не оставит его.

Это решение не идеально, но я думаю, что это лучшее, что у вас есть на данный момент. Это заставляет вас доверять пользователю, но понимайте, что альтернатива будет означать потенциально худший опыт для всех на рынке приложений.

Ответ 9

AndroidRate - это библиотека, которая поможет вам продвигать ваше приложение для Android, предлагая пользователям оценивать приложение после его использования в течение нескольких дней.

Модуль Gradle:

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

MainActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  StoreType storeType = StoreType.GOOGLEPLAY; // options: GOOGLEPLAY or AMAZON

  AppRate.with(this)
      .setStoreType(StoreType.GOOGLEPLAY) //default is GOOGLEPLAY, other option is AMAZON
      .setInstallDays(0) // default 10, 0 means install day
      .setLaunchTimes(3) // default 10
      .setRemindInterval(2) // default 1
      .setRemindLaunchTimes(2) // default 1 (each launch)
      .setShowLaterButton(true) // default true
      .setDebug(false) // default false
      .setOnClickButtonListener(new OnClickButtonListener() { // callback listener.
          @Override
          public void onClickButton(int which) {
              Log.d(MainActivity.class.getName(), Integer.toString(which));
          }
      })
      .monitor();

  if (storeType == 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);
  }
}

Условия по умолчанию для отображения диалоговом окне скорости:

  • Приложение запускается более чем на 10 дней позже установки. Изменить через AppRate#setInstallDays(int).
  • Приложение запускается более 10 раз. Измените с помощью AppRate#setLaunchTimes(int).
  • Приложение запускается более 1 дня после нажатия кнопки нейтрали. Изменить через AppRate#setRemindInterval(int).
  • Приложение запускается X раз и X% 1 = 0. Измените с помощью AppRate#setRemindLaunchTimes(int).
  • По умолчанию приложение показывает нейтральный диалог (напомнить мне позже). Измените с помощью setShowLaterButton(boolean).
  • Чтобы указать обратный вызов при нажатии кнопки. То же значение, что и второй аргумент DialogInterface.OnClickListener#onClick, будет передано в аргументе onClickButton.
  • Настройка AppRate#setDebug(boolean) гарантирует, что запрос рейтинга будет отображаться каждый раз при запуске приложения. Эта функция предназначена только для разработки!.

Дополнительные пользовательские требования к событию для отображения диалога

Вы можете добавить дополнительные необязательные требования для отображения диалога. Каждое требование может быть добавлено/указано как уникальная строка. Вы можете установить минимальное количество для каждого такого события (например, "action_performed" 3 раза, "button_clicked" 5 раз и т.д.).

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

Отметить флаг диалогового окна

Если вы хотите снова отобразить диалог, вызовите AppRate#clearAgreeShowDialog().

AppRate.with(this).clearAgreeShowDialog();

Когда кнопка нажимает

вызов AppRate#showRateDialog(Activity).

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

Установить пользовательский вид

вызов 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();

Конкретная тема

Вы можете использовать определенную тему для раздувания диалогового окна.

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

Пользовательский диалог

Если вы хотите использовать свои собственные ярлыки диалогового окна, переопределите ресурсы xml в вашем приложении.

<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>

Убедитесь, что Google Play доступен

if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) != ConnectionResult.SERVICE_MISSING) {

}