Androidアプリにレートイット機能を実装する方法


94

Androidアプリを開発しています。すべてが正しく機能しています。アプリを起動する準備ができました。しかし、もう1つ機能を実装する必要があります。を含むポップアップを表示する必要があります

Rate It そして Remind me later

ここで、ユーザーが市場でアプリを評価した場合、ポップアップは消えません。Googleで検索したところ、1つのリンクが見つかりました。これで私はそれを知ることが不可能であることを理解しています。だから私はこれについての提案が必要です。

誰かが以前にこの状況に直面したことがありますか?もしそうなら、これに対する解決策や代替策はありますか?


それで、評価するだけを要求するか、後で通知するか、または特定のユーザーがAndroidアプリを評価したかどうかを知る方法を要求しますか?
wtsang02 2013年

1
ポップアップを実装しました。しかし、ユーザーがアプリを評価したかどうかを知る方法
Naveen 2013年

-1この質問とリンクの質問の違いはわかりません。
wtsang02 2013年

2
@ wtsang02、本当かもしれません。しかし、質問を参照してください。その上で尋ねたMar 15 2011。だからほぼ20ヶ月以上。誰かが私の要件に対して解決策または代替案を持っていると思います。それはここに投稿されました。
Naveen 2013年

ライブラリgithub.com/Vorlonsoft/AndroidRateimplementation 'com.vorlonsoft:androidrate:1.0.3')を使用できます
Alexander Savin

回答:


180

しばらく前から実装しました。ユーザーがアプリを評価したかどうかを確認して、評価が通貨にならないようにすることはできません(一部の開発者は、「このアプリを評価して無料でアプリに追加する」などのオプションを追加する場合があります)。

私が作成したクラスは3つのボタンを提供し、アプリが起動された後にのみ表示されるようにダイアログを構成します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);

あなたの活動に。アプリ全体で1つのアクティビティに追加するだけです。


1
これは、同じデバイスを使用する複数のユーザーをサポートしません。
AsafK

1
@AsafKはい。ただし、同じデバイスを使用する複数のユーザーは、apprater認証後にダイアログを表示しshared preference、Googleメールアドレスをに含めるように変更するだけで処理できますkey
スティーブン2015

1
こんにちは、1つだけ質問があります。なぜすべてを静的にしたのですか?ラガブありがとう!
Ruchir Baronia

2
こんにちは、私はあなたの上記のコードを試しています。MainActivityのAppRater.app_launched(this);中に入れonCreate()ました。起動に必要な最小数も2に変更しましたが、2つのアプリの起動後にダイアログが表示されません。あなたは私を助けることができます?ありがとう!
例外

1
より良い列挙型を使用するContext.MODE_PRIVATE-context.getSharedPreferences("apprater", Context.MODE_PRIVATE);
のVivek

18

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

}

いいね!Dialogの読み込み時に問題が発生した場合に備えて、DialogFragmentを表示する前にeditor.commit()を配置します。
narko

@narkoありがとう。更新しました。
ミクセル2015年

注:を使用して共有設定を保存すると、メモリリークが発生する可能性があります。setPositiveButtonsetNegativeButtonで注意深く気づいた場合は、コミットを使用して共有設定に書き込みを行っていますが、applyを使用した場合は非同期で、アクティビティーへの参照は、それが完了するまで、そしてdismissを呼び出した直後に保持されます。Dismissはフラグメントを破棄しようとしますが、アクティビティは共有設定適用プロセスによって保持/使用されているため、破棄できません(AndroidStudioはコミットを適用するように変更するようユーザーに要求するため、これを着用しましたが、他のロジックを使用してください)
Sai

@mixelアクティビティでフラグメントなしで使用できるようにコードを変更するにはどうすればよいですか?
user1090751

7

あなたがやろうとしていることはおそらく逆効果だと思います。

人々がアプリを評価するのを簡単にすることは、彼らがアプリを気に入っているので気にかけるほとんどの人と同じように、一般的に良い考えです。格付けの数が市場の格付けに影響を与えると噂されています(ただし、これについてはほとんど証拠がありません)。ナグ画面を介して評価にユーザーを煩わせることは、人々が悪い評価を残してナグをクリアする原因になる可能性があります。

アプリを直接評価する機能を追加すると、無料バージョンの数値による評価がわずかに減少し、有料アプリもわずかに増加しました。無料のアプリの場合、私のアプリの評価は5つ星よりも高くなりました。これは、自分のアプリは優れているが、あまり良くないと思っていたユーザーも同様に評価し始めたためです。変化は約-0.2でした。有償の場合、変化は約+0.1でした。たくさんのコメントが欲しいのを除いて、私はそれを無料版から削除すべきです。

評価ボタンを設定(設定)画面に配置しましたが、通常の操作には影響しません。それでも私の評価率は4倍または5倍に増加しました。ユーザーに評価を強要した場合、抗議として多くのユーザーに悪い評価を与えてしまうことは間違いありません。


100%正しい。私の無料アプリでも同じことが起こりました。
akash varlani 2017年

7

AndroidRateは、Androidアプリを数日間使用した後にアプリを評価するようユーザーに促すことで、Androidアプリの宣伝に役立つライブラリです。

モジュール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);
  }
}

レートダイアログを表示するデフォルトの条件は次のとおりです。

  1. アプリがインストールから10日以上遅れて起動された。を介して変更しAppRate#setInstallDays(byte)ます。
  2. アプリが10回以上起動されている。を介して変更しAppRate#setLaunchTimes(byte)ます。
  3. ニュートラルボタンがクリックされてから1日以上経過してアプリが起動されます。を介して変更しAppRate#setRemindInterval(byte)ます。
  4. アプリはX回起動され、X%1 = 0 AppRate#setRemindLaunchTimes(byte)です。を介して変更します。
  5. アプリはデフォルトで中立的なダイアログ(後で通知)を表示します。を介して変更しsetShowLaterButton(boolean)ます。
  6. ボタンが押されたときのコールバックを指定します。第2引数と同じ値DialogInterface.OnClickListener#onClickの引数に渡されますonClickButton
  7. 設定AppRate#setDebug(boolean)により、アプリが起動されるたびに評価リクエストが表示されるようになります。この機能は開発専用です。

ダイアログを表示するためのオプションのカスタムイベント要件

ダイアログを表示するためのオプションの要件を追加できます。各要件は、一意の文字列として追加/参照できます。そのようなイベントごとに最小カウントを設定できます(たとえば、「action_performed」が3回、「button_clicked」が5回など)。

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

ダイアログの表示フラグをクリア

再度ダイアログを表示したい場合はを呼び出してください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(int);

カスタムダイアログ

独自のダイアログラベルを使用する場合は、アプリケーションの文字列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) {

}


3

このソリューションは、上記のソリューションと非常に似ています。唯一の違いは、起動と日ごとに評価ダイアログのプロンプトを遅らせることができるということです。[後で通知する]ボタンが押された場合、ポップアップを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>

出典:「アプリケーションの評価」に対するAndroidのアプローチ


「構成」とは何ですか。試しても見つかりません。
Md Imran Choudhury

1
@ Md.ImranChoudhury返信が遅くなってすみません。configsは、Googleアナリティクスで使用する私のプライベートクラスです。問題なくそのステートメントを削除できます!
Gustavo Baiocchi Costa

あなたは元の答えにリンクするか、彼に信用を与えるべきです。stackoverflow.com/a/6920848/563735
Rohit Mandiwal 2017年


1

リンクした他の投稿からわかるように、ユーザーがレビューを残したかどうかをアプリが知る方法はありません。そして正当な理由で。

考えてみてください。ユーザーがレビューを残したかどうかをアプリが判断できる場合、開発者は、ユーザーが5/5の評価を残した場合にのみロック解除される特定の機能を制限できます。これにより、Google Playの他のユーザーがレビューを信頼できなくなり、評価システムが損なわれます。

私が見た別の解決策は、アプリが特定の回数、または設定された間隔で開かれるたびに、アプリがユーザーに評価を送信するように通知することです。たとえば、アプリが10回開かれるたびに、評価を残すようにユーザーに依頼し、「完了」ボタンと「後で通知」ボタンを提供します。ユーザーが後で通知することを選択した場合は、このメッセージを表示し続けます。他の一部のアプリ開発者は、間隔をあけて(たとえば、アプリを開いたときに5、10、15回目に)このメッセージを表示します。これは、ユーザーがレビューを残しなかった場合(たとえば、アプリを開いた100回目)、多分おそらく彼/それを残さないでしょう。

この解決策は完璧ではありませんが、今のところあなたが持っている最高の解決策だと思います。それはあなたをユーザーを信頼するように導きますが、代替手段がアプリ市場のすべての人にとって潜在的に悪い体験を意味することを理解してください。


1

Java&Kotlinソリューション(2020年のGoogleによるアプリ内レビューAPI):

ここに画像の説明を入力してください

まず、build.gradle(app)ファイルに次の依存関係を追加します(完全な設定はここ

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

このメソッドをあなたに追加してください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.
        }
    });
}

他のメソッドと同じように呼び出します。

askRatings();

Kotlinコードはここにあります


0

Raghav Soodの回答のKotlinバージョン

評価者.kt

    class Rater {
      companion object {
        private const val APP_TITLE = "App Name"
        private const val APP_NAME = "com.example.name"

        private const val RATER_KEY = "rater_key"
        private const val LAUNCH_COUNTER_KEY = "launch_counter_key"
        private const val DO_NOT_SHOW_AGAIN_KEY = "do_not_show_again_key"
        private const val FIRST_LAUNCH_KEY = "first_launch_key"

        private const val DAYS_UNTIL_PROMPT: Int = 3
        private const val LAUNCHES_UNTIL_PROMPT: Int = 3

        fun start(mContext: Context) {
            val prefs: SharedPreferences = mContext.getSharedPreferences(RATER_KEY, 0)
            if (prefs.getBoolean(DO_NOT_SHOW_AGAIN_KEY, false)) {
                return
            }

            val editor: Editor = prefs.edit()

            val launchesCounter: Long = prefs.getLong(LAUNCH_COUNTER_KEY, 0) + 1;
            editor.putLong(LAUNCH_COUNTER_KEY, launchesCounter)

            var firstLaunch: Long = prefs.getLong(FIRST_LAUNCH_KEY, 0)
            if (firstLaunch == 0L) {
                firstLaunch = System.currentTimeMillis()
                editor.putLong(FIRST_LAUNCH_KEY, firstLaunch)
            }

            if (launchesCounter >= LAUNCHES_UNTIL_PROMPT) {
                if (System.currentTimeMillis() >= firstLaunch +
                    (DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000)
                ) {
                    showRateDialog(mContext, editor)
                }
            }

            editor.apply()
        }

        fun showRateDialog(mContext: Context, editor: Editor) {
            Dialog(mContext).apply {
                setTitle("Rate $APP_TITLE")

                val ll = LinearLayout(mContext)
                ll.orientation = LinearLayout.VERTICAL

                TextView(mContext).apply {
                    text =
                        "If you enjoy using $APP_TITLE, please take a moment to rate it. Thanks for your support!"

                    width = 240
                    setPadding(4, 0, 4, 10)
                    ll.addView(this)
                }

                Button(mContext).apply {
                    text = "Rate $APP_TITLE"
                    setOnClickListener {
                        mContext.startActivity(
                            Intent(
                                Intent.ACTION_VIEW,
                                Uri.parse("market://details?id=$APP_NAME")
                            )
                        );
                        dismiss()
                    }
                    ll.addView(this)
                }

                Button(mContext).apply {
                    text = "Remind me later"
                    setOnClickListener {
                        dismiss()
                    };
                    ll.addView(this)
                }

                Button(mContext).apply {
                    text = "No, thanks"
                    setOnClickListener {
                        editor.putBoolean(DO_NOT_SHOW_AGAIN_KEY, true);
                        editor.commit()
                        dismiss()
                    };
                    ll.addView(this)
                }

                setContentView(ll)
                show()
            }
        }
    }
}

最適化された回答

評価者.kt

class Rater {
    companion object {
        fun start(context: Context) {
            val prefs: SharedPreferences = context.getSharedPreferences(RATER_KEY, 0)
            if (prefs.getBoolean(DO_NOT_SHOW_AGAIN_KEY, false)) {
                return
            }

            val editor: Editor = prefs.edit()

            val launchesCounter: Long = prefs.getLong(LAUNCH_COUNTER_KEY, 0) + 1;
            editor.putLong(LAUNCH_COUNTER_KEY, launchesCounter)

            var firstLaunch: Long = prefs.getLong(FIRST_LAUNCH_KEY, 0)
            if (firstLaunch == 0L) {
                firstLaunch = System.currentTimeMillis()
                editor.putLong(FIRST_LAUNCH_KEY, firstLaunch)
            }

            if (launchesCounter >= LAUNCHES_UNTIL_PROMPT) {
                if (System.currentTimeMillis() >= firstLaunch +
                    (DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000)
                ) {
                    showRateDialog(context, editor)
                }
            }

            editor.apply()
        }

        fun showRateDialog(context: Context, editor: Editor) {
            Dialog(context).apply {
                setTitle("Rate $APP_TITLE")
                LinearLayout(context).let { layout ->
                    layout.orientation = LinearLayout.VERTICAL
                    setDescription(context, layout)
                    setPositiveAnswer(context, layout)
                    setNeutralAnswer(context, layout)
                    setNegativeAnswer(context, editor, layout)
                    setContentView(layout)
                    show()       
                }
            }
        }

        private fun setDescription(context: Context, layout: LinearLayout) {
            TextView(context).apply {
                text = context.getString(R.string.rate_description, APP_TITLE)
                width = 240
                setPadding(4, 0, 4, 10)
                layout.addView(this)
            }
        }

        private fun Dialog.setPositiveAnswer(
            context: Context,
            layout: LinearLayout
        ) {
            Button(context).apply {
                text = context.getString(R.string.rate_now)
                setOnClickListener {
                    context.startActivity(
                        Intent(
                            Intent.ACTION_VIEW,
                            Uri.parse(context.getString(R.string.market_uri, APP_NAME))
                        )
                    );
                    dismiss()
                }
                layout.addView(this)
            }
        }

        private fun Dialog.setNeutralAnswer(
            context: Context,
            layout: LinearLayout
        ) {
            Button(context).apply {
                text = context.getString(R.string.remind_later)
                setOnClickListener {
                    dismiss()
                };
                layout.addView(this)
            }
        }

        private fun Dialog.setNegativeAnswer(
            context: Context,
            editor: Editor,
            layout: LinearLayout
        ) {
            Button(context).apply {
                text = context.getString(R.string.no_thanks)
                setOnClickListener {
                    editor.putBoolean(DO_NOT_SHOW_AGAIN_KEY, true);
                    editor.commit()
                    dismiss()
                };
                layout.addView(this)
            }
        }
    }
}

Constants.kt

object Constants {

    const val APP_TITLE = "App Name"
    const val APP_NAME = "com.example.name"

    const val RATER_KEY = "rater_key"
    const val LAUNCH_COUNTER_KEY = "launch_counter_key"
    const val DO_NOT_SHOW_AGAIN_KEY = "do_not_show_again_key"
    const val FIRST_LAUNCH_KEY = "first_launch_key"

    const val DAYS_UNTIL_PROMPT: Int = 3
    const val LAUNCHES_UNTIL_PROMPT: Int = 3

}

strings.xml

<resources>
    <string name="rate_description">If you enjoy using %1$s, please take a moment to rate it. Thanks for your support!</string>
    <string name="rate_now">Rate now</string>
    <string name="no_thanks">No, thanks</string>
    <string name="remind_later">Remind me later</string>
    <string name="market_uri">market://details?id=%1$s</string>
</resources>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.