Lien «Évaluez cette application» dans l'application Google Play Store sur le téléphone


266

Je voudrais mettre un lien "Noter cette application" dans une application Android pour ouvrir la liste des applications dans l'application Google Play Store de l'utilisateur sur son téléphone.

  1. Quel code dois-je écrire pour créer le market://ouhttp:// lien ouvert dans l'application Google Play Store sur le téléphone?
  2. Où mettez-vous le code?
  3. Quelqu'un a-t-il un exemple d'implémentation de cela?
  4. Devez-vous spécifier l'écran où le lien market://ou http://sera placé, et lequel est le meilleur à utiliser - market://ou http://?

Cela a tout ce dont vous avez besoin: github.com/delight-im/AppRater Et vous pouvez rechercher le code source pour comprendre comment cela se fait.
caw

Réponses:


555

J'ouvre le Play Store à partir de mon application avec le code suivant:

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

Cela lancera le Play Store avec la page de votre application déjà ouverte. L'utilisateur peut l'évaluer ici.


2
Où dans le fichier androidmanifest.xml dois-je placer ce code? Dois-je ajouter autre chose? Comment cela correspond-il à un lien ou un bouton réel sur un écran sur lequel l'utilisateur appuie? Merci
Adreno

1
Vous n'avez pas besoin d'ajouter de code au manifeste. Il vous suffit de placer ce code dans le OnClickListener de votre bouton / lien, donc lorsque vous cliquez sur le bouton, le code est exécuté et le Play Store est lancé.
miguel.rodelas

61
Cette solution ne compte pas avec Backstack Play Market. Après avoir appuyé sur le bouton Retour, vous n'êtes pas ramené à votre application. Si vous le souhaitez, ajoutez cette ligne: 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: Cette constante a été déconseillée au niveau de l'API 21. À partir de l'API 21, cela fonctionne de manière identique à FLAG_ACTIVITY_NEW_DOCUMENT qui devrait être utilisé à la place de cela.
xnagyg

1
Si vous appelez à partir d'une classe java non-Activity, vous devez passer le contexte comme context.startActivity (goToMarket);
DMur

47

Voici un code fonctionnel et à jour :)

/*
* 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;
}

Mettez le code dans lequel Activityvous souhaitez l'appeler.
Lorsque l'utilisateur clique sur un bouton pour évaluer l'application, il suffit d'appeler la rateApp()fonction.


Quel package NuGet dois-je ajouter et quel espace de noms dois-je utiliser usingpour Intentêtre un type viable? J'ai trouvé Android.Content , mais je suis perdu avec Intentdans Xamarin Forms.
s3c

24

J'utilise toujours ce code:

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

4
Toujours comme un liners. :)
androidStud

je l'utilise mais il montre cette erreur - `android.content.ActivityNotFoundException: aucune activité trouvée pour gérer l'intention {act = android.intent.action.VIEW dat = market: // details? id = PackageName}` - que puis-je faire ?
Mina Dahesh

Pouvez-vous vérifier cela ?
Cabezas

@Cabezas. En général, je veux montrer tout le marché existant au téléphone. en cliquant sur lequel d'entre eux, si mon application existait, le marché affiche l'application. Alors, que dois-je faire?
Mina Dahesh

1
@Cabezas. j'utilise ce code: `try {Intent intention = new Intent (Intent.ACTION_VIEW); intent.setData (Uri.parse ("bazaar: // details? id = vow_note.maxsoft.com.vownote")); intent.setData (Uri.parse ("monket: // commentaire? id = vow_note.maxsoft.com.vownote")); startActivity (intention); } 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) {Toast.} `
Mina Dahesh

18

C'est le cas si vous publiez votre application dans Google Play Store et Amazon Appstore. Je gère également le cas où les utilisateurs (en particulier en Chine) n'ont pas à la fois l'App Store et le navigateur.

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

Ne répond pas à la question posée.

qu'en est-il du code pour ouvrir la liste Amazon App Store de votre application?
isJulian00

Quel package NuGet dois-je ajouter et quel espace de noms dois-je utiliser usingpour Intentêtre un type viable? J'ai trouvé Android.Content , mais je suis perdu avec Intentdans Xamarin Forms.
s3c

10

Vous pouvez toujours appeler getInstalledPackages () à partir de la classe PackageManager et vérifier que la classe de marché est installée. Vous pouvez également utiliser queryIntentActivities () pour vous assurer que l'intention que vous construisez pourra être gérée par quelque chose, même si ce n'est pas l'application du marché. C'est probablement la meilleure chose à faire car c'est la plus flexible et la plus robuste.

Vous pouvez vérifier si l'application de marché est disponible en

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

Si la liste contient au moins une entrée, le marché est là.

Vous pouvez utiliser ce qui suit pour lancer Android Market sur la page de votre application, c'est un peu plus automatisé:

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

Si vous voulez tester cela sur votre émulateur, vous n'avez probablement pas le marché installé dessus: consultez ces liens pour plus de détails:

Comment activer l'Android Market dans l'émulateur Google Android

Installation de Google Play sur l'émulateur Android


Où dans le fichier androidmanifest.xml dois-je placer ce code? Dois-je ajouter autre chose? Comment cela correspond-il à un lien ou un bouton réel sur un écran sur lequel l'utilisateur appuie? Merci
Adreno

8

J'utilise cette approche pour que les utilisateurs évaluent mes applications:

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

À quoi cela sert-il? - market://details?id=Mon lien d'application est commehttps:\\play.google.com\apps\details?id=
Sagar Balyan

2
@SagarBalyan, c'est un uri spécial pour ouvrir la page de votre application sur l'application google play market. Si vous démarrez l'activité avec le lien que vous avez fourni, Android ouvrira la page de votre application dans le navigateur par défaut ou vous donnera le choix de l'application de navigateur à démarrer
gtgray

5

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

Vous pouvez l'utiliser, cela fonctionne pour moi

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

Classement Play Store

 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 est une autre approche qui peut fonctionner pour vous. Si j'ai une TextView qui demande à l'utilisateur d'évaluer l'application, je peux lier quelques mots dans le texte afin qu'ils soient mis en surbrillance et lorsque l'utilisateur les touche, le Play Store s'ouvre, prêt à être examiné:

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

Un point concernant toutes les réponses qui ont des implémentations basées sur la stratégie getPackageName () est que l'utilisation de BuildConfig.APPLICATION_ID peut être plus simple et fonctionne bien si vous utilisez la même base de code pour créer plusieurs applications avec différents ID d'application (par exemple, un produit en marque blanche).


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 est le nom du compte développeur sur le Play Store


2

Vous pouvez utiliser ce code simple pour évaluer votre application dans votre activité.

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

À quoi cela sert-il? - market://details?id=Mon lien d'application est commehttps:\\play.google.com\apps\details?id=
Sagar Balyan

@SagarBalyan Si l'utilisateur a plusieurs marchés d'applications, il ouvrira le magasin par défaut ou lui montrera une intention pour chaque magasin disponible.
Avi Parshan

2

J'utilise l'approche suivante en combinant ceci et cette réponse sans utiliser de programmation basée sur les exceptions et prend également en charge l'indicateur d'intention pré-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());

Étant donné que l'indicateur d'intention FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETest obsolète de l'API 21, j'utilise le@SuppressWarnings("deprecation") balise de la méthode getRateIntent car mon SDK cible d'application est inférieur à l'API 21.


J'ai également essayé la manière officielle de Google suggérée sur leur site Web (6 décembre 2019). Pour ce que je vois, il ne gère pas le cas si l'application Play Store n'est pas installée:

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

Déclarez une méthode dans votre classe d'activité. Copiez et collez ensuite le code ci-dessous.

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

}

Appelez maintenant cette méthode depuis n'importe où dans votre code.

Suivez l'image ci-dessous de mon projet pratique.

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.