スマートフォンのGoogle Playストアアプリの「このアプリを評価」リンク


266

Androidアプリに「このアプリを評価」リンクを配置して、ユーザーの携帯電話でユーザーのGoogle Playストアアプリのアプリリストを開きたいのですが。

  1. 携帯電話のGoogle Playストアアプリでmarket://or http://-link open を作成するには、どのコードを書く必要がありますか?
  2. コードはどこに配置しますか?
  3. 誰かがこれのサンプル実装を持っていますか?
  4. market://またはhttp://リンクを配置する画面を指定する必要がありますか、どちらを使用するのが最適ですか- market://またはhttp://

これには必要なものがすべて揃っています:github.com/delight-im/AppRaterそして、ソースコードを調べて、それがどのように行われるかを理解できます。
2016

回答:


555

アプリから次のコードでPlayストアを開きます。

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

アプリページが既に開いた状態でPlayストアが起動します。ユーザーはそこで評価できます。


2
androidmanifest.xmlのどこにこのコードを配置しますか?他に何か追加する必要がありますか?これは、ユーザーが押す画面上の実際のリンクまたはボタンにどのように対応していますか?ありがとう
Adreno

1
マニフェストにコードを追加する必要はありません。このコードをボタン/リンクのOnClickListener内に配置するだけでよいので、ボタンがクリックされると、コードが実行され、Playストアが起動します。
miguel.rodelas

61
このソリューションは、Playマーケットのバックスタックでは考慮されません。戻るボタンを押すと、アプリケーションに戻りません。必要に応じて、次の行を追加します:intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
Jan Muller

24
Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET:この定数はAPIレベル21で廃止されました。API21以降、これは代わりに使用する必要があるFLAG_ACTIVITY_NEW_DOCUMENTと同じように実行されます。
xnagyg 2015

1
非アクティビティJavaクラスから呼び出す場合は、context.startActivity(goToMarket);のようなコンテキストを渡す必要があります。
DMur

47

これが動作していて最新のコードです:)

/*
* Start with rating the app
* Determine if the Play Store is installed on the device
*
* */
public void rateApp()
{
    try
    {
        Intent rateIntent = rateIntentForUrl("market://details");
        startActivity(rateIntent);
    }
    catch (ActivityNotFoundException e)
    {
        Intent rateIntent = rateIntentForUrl("https://play.google.com/store/apps/details");
        startActivity(rateIntent);
    }
}

private Intent rateIntentForUrl(String url)
{
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(String.format("%s?id=%s", url, getPackageName())));
    int flags = Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
    if (Build.VERSION.SDK_INT >= 21)
    {
        flags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
    }
    else
    {
        //noinspection deprecation
        flags |= Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
    }
    intent.addFlags(flags);
    return intent;
}

Activity呼び出し元のコードを入れます。
ユーザーがボタンをクリックしてアプリを評価するときは、rateApp()関数を呼び出すだけです。


追加する必要があるNuGetパッケージ、および実行可能な型になるusingためIntentに必要な名前空間 Android.Contentを見つけましたがIntent、Xamarin Forms で迷っています。
s3c

24

私はいつもこのコードを使います:

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

4
常に1つのライナーのように。:)
androidStud

私はそれを使用していますが、このエラーが表示されます-`android.content.ActivityNotFoundException:Intent {act = android.intent.action.VIEW dat = market:// details?id = PackageName}`を処理するアクティビティが見つかりません-何ができますか?
ミナダヘッシュ2017

これを確認できますか?
Cabezas

@Cabezas。一般的に、既存のすべての市場を電話で表示したいと思います。それらのどれかをクリックすると、私のアプリが存在する場合、マーケットにアプリが表示されます。だから私は何をすべきですか?
ミナダヘッシュ2017

1
@Cabezas。私はこのコードを使用します: `try {Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse( "bazaar:// details?id = vow_note.maxsoft.com.vownote")); intent.setData(Uri.parse( "myket:// comment?id = vow_note.maxsoft.com.vownote")); startActivity(intent); } catch(ActivityNotFoundException e1){try {startActivity(new Intent(Intent.ACTION_VIEW、Uri.parse( "MARKET URL"))); startActivity(new Intent(Intent.ACTION_VIEW、Uri.parse( "MARKET URL"))); } catch(ActivityNotFoundException e2){トースト} `
Mina Dahesh

18

これは、Google PlayストアとAmazon Appstoreの両方でアプリを公開する場合です。また、ユーザー(特に中国)がアプリストアとブラウザーの両方を持っていない場合にも対応します。

public void goToMyApp(boolean googlePlay) {//true if Google Play, false if Amazone Store
    try {
       startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse((googlePlay ? "market://details?id=" : "amzn://apps/android?p=") +getPackageName())));
    } catch (ActivityNotFoundException e1) {
        try {
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse((googlePlay ? "http://play.google.com/store/apps/details?id=" : "http://www.amazon.com/gp/mas/dl/android?p=") +getPackageName())));
        } catch (ActivityNotFoundException e2) {
            Toast.makeText(this, "You don't have any app that can open this link", Toast.LENGTH_SHORT).show();
        }
    }
}

目の前の質問には答えません。

アプリのアマゾンアプリストアリストを開くコードはどうですか?
isJulian00

追加する必要があるNuGetパッケージ、および実行可能な型になるusingためIntentに必要な名前空間 Android.Contentを見つけましたがIntent、Xamarin Forms で迷っています。
s3c

10

PackageManagerクラスから常にgetInstalledPackages()を呼び出し、マーケットクラスがインストールされていることを確認できます。また、使用することができます)(queryIntentActivitiesを意図します構築物は、それが市場のアプリケーションではありません場合でも、何かが取り扱うことができるようになることを確認します。これは最も柔軟で堅牢であるため、おそらく実際に行うのが最善の方法です。

あなたはマーケットアプリがそこにあるかどうかを確認することができます

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://search?q=foo"));
PackageManager pm = getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);

リストに少なくとも1つのエントリがある場合、マーケットがあります。

以下を使用して、アプリケーションのページでAndroidマーケットを起動できます。これは少し自動化されています。

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

エミュレータでこれをテストする場合は、おそらく市場にインストールされていません。詳細については、次のリンクを参照してください。

Google Android EmulatorでAndroidマーケットを有効にする方法

Android EmulatorにGoogle Playをインストールする


androidmanifest.xmlのどこにこのコードを配置しますか?他に何か追加する必要がありますか?これは、ユーザーが押す画面上の実際のリンクまたはボタンにどのように対応していますか?ありがとう
Adreno

8

私はこのアプローチを使用して、ユーザーが私のアプリを評価するようにします。

public static void showRateDialog(final Context context) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context)
            .setTitle("Rate application")
            .setMessage("Please, rate the app at PlayMarket")
            .setPositiveButton("RATE", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (context != null) {
                        String link = "market://details?id=";
                        try {
                            // play market available
                            context.getPackageManager()
                                    .getPackageInfo("com.android.vending", 0);
                        // not available
                        } catch (PackageManager.NameNotFoundException e) {
                            e.printStackTrace();
                            // should use browser
                            link = "https://play.google.com/store/apps/details?id=";
                        }
                        // starts external action
                        context.startActivity(new Intent(Intent.ACTION_VIEW, 
                                Uri.parse(link + context.getPackageName())));
                    }
                }
            })
            .setNegativeButton("CANCEL", null);
    builder.show();
}

これは何のためですか?- market://details?id=私のアプリのリンクは次のようなものですhttps:\\play.google.com\apps\details?id=
Sagar Balyan 2017年

2
@SagarBalyan、それはグーグルプレイマーケットアプリケーションであなたのアプリページを開くための特別なURIです。リンクを指定してアクティビティを開始すると、Androidはアプリのページをデフォルトのブラウザーで開くか、どのブラウザーアプリを開始するかを選択します
gtgray

5

Kotlinバージョン

fun openAppInPlayStore() {
    val uri = Uri.parse("market://details?id=" + context.packageName)
    val goToMarketIntent = Intent(Intent.ACTION_VIEW, uri)

    var flags = Intent.FLAG_ACTIVITY_NO_HISTORY or Intent.FLAG_ACTIVITY_MULTIPLE_TASK
    flags = if (Build.VERSION.SDK_INT >= 21) {
        flags or Intent.FLAG_ACTIVITY_NEW_DOCUMENT
    } else {
        flags or Intent.FLAG_ACTIVITY_CLEAR_TASK
    }
    goToMarketIntent.addFlags(flags)

    try {
        startActivity(context, goToMarketIntent, null)
    } catch (e: ActivityNotFoundException) {
        val intent = Intent(Intent.ACTION_VIEW,
                Uri.parse("http://play.google.com/store/apps/details?id=" + context.packageName))

        startActivity(context, intent, null)
    }
}

4

あなたはこれを使うことができます、それは私のために働きます

public static void showRateDialogForRate(final Context context) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context)
            .setTitle("Rate application")
            .setMessage("Please, rate the app at PlayMarket")
            .setPositiveButton("RATE", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (context != null) {
                        ////////////////////////////////
                        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_CLEAR_WHEN_TASK_RESET |
                                Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
                        try {
                            context.startActivity(goToMarket);
                        } catch (ActivityNotFoundException e) {
                            context.startActivity(new Intent(Intent.ACTION_VIEW,
                                    Uri.parse("http://play.google.com/store/apps/details?id=" + context.getPackageName())));
                        }


                    }
                }
            })
            .setNegativeButton("CANCEL", null);
    builder.show();
}

4

Playストアの評価

 btn_rate_us.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Uri uri = Uri.parse("market://details?id=" + 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=" + getPackageName())));
                }
            }
        });

3

あなたのために働くかもしれないもう一つのアプローチはLinkifyです。ユーザーにアプリを評価するように求めるTextViewがある場合、テキスト内のいくつかの単語をリンクして強調表示し、ユーザーがそれらに触れるとPlayストアが開いてレビューの準備ができます。

class playTransformFilter implements TransformFilter {
   public String transformUrl(Matcher match, String url) {
        return "market://details?id=com.qwertyasd.yourapp";
   }
}

class playMatchFilter implements MatchFilter {
    public boolean acceptMatch(CharSequence s, int start, int end) {
        return true;
    }
}
text1 = (TextView) findViewById(R.id.text1);
text1.setText("Please rate it.");
final Pattern playMatcher = Pattern.compile("rate it");
Linkify.addLinks(text1, playMatcher, "", 
                   new playMatchFilter(), new playTransformFilter());

3

getPackageName()戦略に基づく実装を持つすべての回答に関する要点は、BuildConfig.APPLICATION_IDを使用するほうが簡単で、同じコードベースを使用して異なるアプリID(たとえば、ホワイトラベル製品)。


2
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.StringRes;
import android.widget.Toast;

public class PlayStoreLink {

public void checkForUpdate(Context context, int applicationId) 
{
    try {
        context.startActivity(new Intent(Intent.ACTION_VIEW,
                Uri.parse(context.getString(R.string.url_market_details)
                        + applicationId)));
    } catch (android.content.ActivityNotFoundException anfe) {
        try {
            context.startActivity(new Intent(Intent.ACTION_VIEW,
                    Uri.parse(context.getString(R.string.url_playstore_app)
                            + applicationId)));
        } catch (Exception e) {
            Toast.makeText(context,
                    R.string.install_google_play_store,
                    Toast.LENGTH_SHORT).show();
        }
    }
}

public void moreApps(Context context, @StringRes int devName) {
    try {
        context.startActivity(new Intent(Intent.ACTION_VIEW,
                Uri.parse(context.getString(R.string.url_market_search_app)
                        + context.getString(devName))));
    } catch (android.content.ActivityNotFoundException anfe) {
        try {
            context.startActivity(new Intent(Intent.ACTION_VIEW,
                    Uri.parse(context.getString(R.string.url_playstore_search_app)
                            + context.getString(devName))));
        } catch (Exception e) {
            Toast.makeText(context,
                    R.string.install_google_play_store,
                    Toast.LENGTH_SHORT).show();
        }
    }
}

public void rateApp(Context context, int applicationId) {
    try {
        Uri uri = Uri.parse(context.getString(R.string.url_market_details)
                + applicationId);
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        int flags = Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH)
            flags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
        else
            flags |= Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
        intent.addFlags(flags);
        context.startActivity(intent);
    } catch (ActivityNotFoundException e) {
        checkForUpdate(context, applicationId);
    }
}
}

<string name="install_google_play_store" translatable="false">Please install google play store and then try again.</string>
<string name="url_market_details" translatable="false">market://details?id=</string>
<string name="url_playstore_app" translatable="false">https://play.google.com/store/apps/details?id=</string>
<string name="url_market_search_app" translatable="false">market://search?q=pub:</string>
<string name="url_playstore_search_app" translatable="false">http://play.google.com/store/search?q=pub:</string>
<string name="app_link" translatable="false">https://play.google.com/store/apps/details?id=</string>

devNameはPlayストアのデベロッパーアカウントの名前です


2

この単純なコードを使用して、アクティビティでアプリを評価できます。

try {
    Uri uri = Uri.parse("market://details?id=" + getPackageName());
    Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(goToMarket);
} catch (ActivityNotFoundException e) {
    startActivity(new Intent(Intent.ACTION_VIEW,
    Uri.parse("http://play.google.com/store/apps/details?id=" + getPackageName())));
}

これは何のためですか?- market://details?id=私のアプリのリンクは次のようなものですhttps:\\play.google.com\apps\details?id=
Sagar Balyan '11 / 10/11

@SagarBalyanユーザーが複数のアプリマーケットを持っている場合、デフォルトのストアを開くか、利用可能なすべてのストアへの意向を示します。
Avi Parshan

2

私は、組み合わせることで、次のアプローチを使用し、このこれなしで解答を使用して、例外ベースのプログラミングをしても、事前にAPI 21意思フラグをサポートしています。

@SuppressWarnings("deprecation")
private Intent getRateIntent()
{
  String url        = isMarketAppInstalled() ? "market://details" : "https://play.google.com/store/apps/details";
  Intent rateIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(String.format("%s?id=%s", url, getPackageName())));
  int intentFlags   = Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
  intentFlags      |= Build.VERSION.SDK_INT >= 21 ? Intent.FLAG_ACTIVITY_NEW_DOCUMENT : Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
  rateIntent.addFlags(intentFlags);
  return rateIntent;
}

private boolean isMarketAppInstalled()
{
  Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=anyText"));
  return getPackageManager().queryIntentActivities(marketIntent, 0).size() > 0;
}


// use
startActivity(getRateIntent());

アプリのターゲットSDKがAPI 21の下にあるため、インテントフラグFLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETはAPI 21から非推奨になっている@SuppressWarnings("deprecation")ため、getRateIntentメソッドでタグを使用します。


私は彼らのウェブサイトで提案された公式の Googleの方法も試しました(2019年12月6日)。Playストアアプリがインストールされていない場合、問題は解決しません。

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(
    "https://play.google.com/store/apps/details?id=com.example.android"));
intent.setPackage("com.android.vending");
startActivity(intent);

0

アクティビティクラスでメソッドを宣言します。次に、以下のコードをコピーして貼り付けます。

private void OpenAppInPlayStore(){

    Uri uri = Uri.parse("market://details?id=" + this.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=" + this.getPackageName())));
    }

}

コードのどこからでもこのメソッドを呼び出します。

私の実際のプロジェクトから下の画像に従ってください。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.