如何在Android App中实现Rate Itfunction

我正在开发一个Android应用程序。 一切正常。 我的应用程序准备启动。 但是我需要再实现一个function。 我需要显示一个包含的popup窗口

Rate ItRemind me later

在这里,如果任何用户在市场上评价应用程序,则popup窗口不会消失。 我在Googlesearch过,find了一个链接 。 有了这个我明白,它不可能知道。 所以我需要一个build议。

有没有人面对过这种情况? 如果是的话,有没有解决办法或者其他办法呢?

我在一定程度上执行了这个。 不可能知道用户是否对应用进行了评分,以防止评分成为货币(一些开发者可能会添加一个选项,如“评价这个应用程序,并免费获取应用程序”)。

我写的这个类提供了三个button,并configuration对话框,以便在应用程序启动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); 

到你的活动。 它只需要添加到整个应用程序中的一个活动。

我使用这个: https : //github.com/kskkbys/Android-RateThisApp – 很好,一种不显眼的行为。 RateThisApp截屏来自kskkbys

我的一个使用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(); } } 

然后在你的主要FragmentActivity的onCreate()中使用它:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... RateItDialogFragment.show(this, getFragmentManager()); } 

使用这个库,它很简单,容易.. https://github.com/hotchemi/Android-Rate

通过添加依赖项

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

我认为你所要做的可能是适得其反的。

让人们轻松评价应用程序通常是一个好主意,因为大多数打扰的人都是这样做的,因为他们喜欢应用程序。 有传言说评级数量会影响你的市场评级(虽然我没有看到这方面的证据)。 让用户陷入评级 – 通过唠叨的屏幕 – 很可能导致人们通过留下糟糕的评级来清除唠叨。

添加直接评估应用程序的能力已经使我的免费版本的数字评分略微下降,而我的付费应用程序略有增加。 对于免费的应用程序,我的4星评价比我的5星评价更高,因为认为我的应用程序很好但不好的人也开始评价。 变化大约是-0.2。 对于付费,变化是+0.1。 我应该从免费版本中删除它,除非我喜欢得到很多评论。

我把我的评价button进入设置(首选项)屏幕,在那里不影响正常的操作。 它仍然将我的评级提高了4或5倍。我毫不怀疑,如果我试图唠叨我的用户进行评级,我会得到很多用户给我的评级不好,作为抗议。

我使用这个简单的解决scheme。 你可以用gradle添加这个库: https : //github.com/fernandodev/easy-rating-dialog

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

这个解决scheme与上面提到的非常相似。 唯一的区别是您将能够延迟评估对话框每次启动和天的提示。 如果稍后提醒我button,那么我会延迟popup3天10次发射。 对于那些select进行评分的人也是这样做的,但是延迟时间更长(如果他没有真正评价应用程序,那么不要太早打扰用户,这可以改变为不再显示,那么你将不得不改变你的代码)。 希望它可以帮助别人!

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

button具有特定的颜色和背景。 背景如下所示在这个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> 

来源: Android方法“评价我的应用程序”

正如您从已链接的其他post中看到的,应用程序无法知道用户是否已经离开审阅。 有很好的理由。

想想看,如果一个应用程序可以告诉用户是否已经离开审查,开发人员可以限制某些function,只有当用户离开5/5评级时才能解锁。 这将导致Google Play的其他用户不信任评论并破坏评分系统。

我看到的替代解决scheme是,应用程序提醒用户提交评级,每当应用程序打开特定的次数,或设置的时间间隔。 例如,每10次打开应用程序,请求用户留下评级,并提供“已完成”和“稍后提醒我”button。 如果用户稍后select提醒他/她,请继续显示此消息。 一些其他应用程序开发人员显示此消息的时间间隔正在增加(例如,应用程序打开时的5,10,15秒),因为如果用户未在第100次打开应用程序时留下评论,可能很可能他/她不会离开一个。

这个解决scheme并不完美,但我认为这是现在最好的。 这确实会引导您相信用户,但是要意识到这种替代方式对于应用市场中的每个人来说都意味着更糟的体验。