web-dev-qa-db-ja.com

アプリ内でAndroidアプリを評価するようユーザーに促します

Androidアプリで、ある時点でAndroidマーケットでアプリを評価するようにユーザーに促したい。

アプローチを検索したところ、コードが見つかりました (このWebサイト上 )。このコードは非常にうまく機能するようです。

しかし、残念ながら、Androidマーケットがユーザーの電話にインストールされていない場合、このコードは「強制終了」エラーメッセージを生成するようです。 Androidマーケットがインストールされているかどうかを確認する方法はありますか。インストールされていない場合は、コードを実行しないでください。

エラーを発生させる行は、URIを解析できないため、おそらく次の行です。

mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + APP_PNAME)));

そして、ところで、そのコードで改善できる他のことはありますか?

編集:

数年後、私はすべてのコードを小さなライブラリプロジェクトに入れました: AppRater on GitHub

30
caw

PackageManager クラスから getInstalledPackages() を呼び出して、マーケットクラスがインストールされていることを確認できます。 queryIntentActivities() を使用して、作成したIntentがマーケットアプリケーションでなくても、何かで処理できるようにすることもできます。これは最も柔軟で堅牢であるため、おそらく実際に行うのが最善の方法です。

14
Kurtis Nusbaum

以下に、必要なすべてのコードを示します(カートの回答と推測された情報の集合体、およびリンクと質問)。

/* This code assumes you are inside an activity */
final Uri uri = Uri.parse("market://details?id=" + getApplicationContext().getPackageName());
final Intent rateAppIntent = new Intent(Intent.ACTION_VIEW, uri);

if (getPackageManager().queryIntentActivities(rateAppIntent, 0).size() > 0)
{
    startActivity(rateAppIntent);
}
else
{
    /* handle your error case: the device has no way to handle market urls */
}
36
xbakesx

RateMeMaybeを使用することもできます: https://github.com/Kopfgeldjaeger/RateMeMaybe

それはあなたに設定するかなりいくつかのオプションを与えます(最初のプロンプトまでの最小日数/起動、ユーザーが「今ではない」を選択した場合の次の各プロンプトまでの最小日数/起動、ダイアログタイトル、メッセージなど)。使い方も簡単です。

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

最初に、アプリケーションの使用回数をカウントする必要があります。

SharedPreferences preferences = getSharedPreferences("progress", MODE_PRIVATE);
int appUsedCount = preferences.getInt("appUsedCount",0);
appUsedCount++;
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("appUsedCount", appUsedCount);
editor.apply();

if (appUsedCount==10 || appUsedCount==50 || appUsedCount==100 || appUsedCount==200 || appUsedCount==300){
    AskForRating(appUsedCount);
} else {
    finish();
}

あなたがこのようにプロンプ​​トすることができるよりも;

private void AskForRating(int _appUsedCount){

    AlertDialog.Builder alert = new AlertDialog.Builder(this);
    alert.setTitle("Please Rate Us");
    alert.setIcon(R.drawable.book);
    alert.setMessage("Thanks for using the application. If you like YOUR APP NAME please rate us! Your feedback is important for us!");
    alert.setPositiveButton("Rate it",new Dialog.OnClickListener(){
        public void onClick(DialogInterface dialog, int whichButton){
            String url = "https://play.google.com/store/apps/details?id=YOUR PACKAGE NAME";
            Intent i = new Intent(Intent.ACTION_VIEW);
            i.setData(Uri.parse(url));
            startActivity(i);
        }
    });
    alert.setNegativeButton("Not now", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            finish();
        }
    });
    alert.show();
}
5
DiRiNoiD

この単純なコードは、外部ライブラリや特別なものを必要とせずに、あなたが望むものを実現します。メインアクティビティのOnCreateイベントに配置するだけです。変数RunEveryは、レートメッセージが表示される頻度を決定します。この例では、10に設定されています。

// Count times app has been opened, display rating message after number of times  
// By Rafael Duval   
    try {

        // Get the app's shared preferences
        SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(this);

        // Get the value for the run counter
        int counter = app_preferences.getInt("counter", 0);

        // Do every x times
        int RunEvery = 10;

        if(counter != 0  && counter % RunEvery == 0 )
        {
            //Toast.makeText(this, "This app has been started " + counter + " times.", Toast.LENGTH_SHORT).show();

           AlertDialog.Builder alert = new AlertDialog.Builder(
                     MyActivity.this);
                   alert.setTitle("Please rate");
                   alert.setIcon(R.drawable.ic_launcher); //app icon here
                   alert.setMessage("Thanks for using this free app. Please take a moment to rate it.");

                   alert.setPositiveButton("Cancel",
                     new DialogInterface.OnClickListener() {
                      public void onClick(DialogInterface dialog,
                        int whichButton) {                            
                          //Do nothing
                      }   
                     });

                   alert.setNegativeButton("Rate it",
                     new DialogInterface.OnClickListener() {

                      public void onClick(DialogInterface dialog, int which) {   

                           final String appName = getApplicationContext().getPackageName();
                           try {
                            startActivity(new Intent(Intent.ACTION_VIEW,
                              Uri.parse("market://details?id="
                                + appName)));
                           } catch (Android.content.ActivityNotFoundException anfe) {
                            startActivity(new Intent(
                              Intent.ACTION_VIEW,
                              Uri.parse("http://play.google.com/store/apps/details?id="
                                + appName)));
                           }   

                      }
                     });
                   alert.show();            
        }


        // Increment the counter
        SharedPreferences.Editor editor = app_preferences.edit();
        editor.putInt("counter", ++counter);
        editor.commit(); // Very important          

    } catch (Exception e) {
        //Do nothing, don't run but don't break
    }           
1
Yo Mismo

すべてのAndroidデバイスはアプリ市場を使用しているわけではありません。KindleとNookは独自のマーケットプレイスを持っているため、マーケットが存在するかどうかを確認するコードの必要性は良いものです。評価が正しいマーケットプレイスに送信されます。

1
Kapt Kaos

「market:// details?id = "+ getApplicationContext()。getPackageName()を使用すると、Mobogenieマーケットが開かれるので、 https://play.google.com/store/apps/details?id = "+ getApplicationContext()。getPackageName()

0

アプリケーションがAndroid Marketを介してダウンロードされた場合、ユーザーはAndroid Marketを電話にインストールしているので、これは本当に問題とは見なされません。それはとても変に見える...

次のコードを使用して、アプリケーションのページでAndroid Marketを起動できます。少し自動化されています。

Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("market://details?id=" + getPackageName()));
startActivity(i);
0
Michell Bak

このコードを使用

Uri uri = Uri.parse("market://details?id=" + context.getPackageName());
Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
// To count with Play market backstack, After pressing back button, 
// to taken back to our application, we need to add following flags to intent. 
goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY |
                Intent.FLAG_ACTIVITY_NEW_DOCUMENT |
                Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
try {
    startActivity(goToMarket);
} catch (ActivityNotFoundException e) {
    startActivity(new Intent(Intent.ACTION_VIEW,
            Uri.parse("http://play.google.com/store/apps/details?id=" + context.getPackageName())));
}
0
Pankaj Talaviya