web-dev-qa-db-fra.com

Inviter l'utilisateur à évaluer une application Android dans l'application

Dans mon application Android, je souhaite demander à l'utilisateur, à un moment donné, d'évaluer l'application sur le marché Android.

Après avoir cherché une approche, j'ai trouvé du code sur ce site . Ce code semble très bien fonctionner.

Mais malheureusement, ce code semble générer un message d'erreur "Fermeture forcée" lorsque Android Market n'est pas installé sur le téléphone de l'utilisateur. Existe-t-il un moyen de vérifier si Android Market est installé et, dans le cas contraire, n'essayez pas d'exécuter le code?

La ligne qui soulève l'erreur est probablement celle-ci car elle ne peut pas analyser l'URI:

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

Et, à propos, y a-t-il d'autres choses qui pourraient être améliorées dans ce code?

Modifier:

Quelques années plus tard, j'ai mis tout le code dans un petit projet de bibliothèque: AppRater sur GitHub

30
caw

Vous pouvez toujours appeler getInstalledPackages () à partir de PackageManager class 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.

14
Kurtis Nusbaum

Voici tout le code dont vous avez besoin (une combinaison des réponses de Kurt et des informations inférées, ainsi que le lien et la question):

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

Vous pouvez également utiliser RateMeMaybe: https://github.com/Kopfgeldjaeger/RateMeMaybe

Il vous donne un certain nombre d'options de configuration (minimum de jours/lancements jusqu'à la première invite, minimum de jours/lancements jusqu'à la prochaine invite si l'utilisateur choisit "pas maintenant", titre de la boîte de dialogue, message, etc.). Il est également facile à utiliser.

Exemple d'utilisation de 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

Vous devez d’abord compter les temps d’application utilisés;

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

Que vous pouvez demander comme ça;

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

Ce code simple réalisera ce que vous voulez, pas besoin de bibliothèques externes ni de fantaisie. Il suffit de le mettre sur l'événement OnCreate sur votre activité principale. La variable RunEvery déterminera la fréquence d'affichage du message de taux. Dans l'exemple, il est défini sur 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

Tous les appareils Android n'utilisent pas le marché des applications. Kindle et Nook ont ​​leur propre marché, le besoin de code pour vérifier si le marché existe ou non est un bon choix. Bien qu'il devrait y avoir un moyen d'envoyer la note au bon marché, peu importe de qui il s'agit. Quelque chose à examiner.

1
Kapt Kaos

Lorsque j'utilise "market: // details? Id =" + getApplicationContext (). GetPackageName (), il ouvre le marché mobogenie sur moi. Je préfère donc utiliser https://play.google.com/store/apps/details. ? id = "+ getApplicationContext (). getPackageName ()

0
Jemshit Iskenderov

Si l'application a été téléchargée via Android Market, Android Market sera installé sur le téléphone. Par conséquent, je ne vois pas cela comme un problème. Cela semble très bizarre ...

Vous pouvez utiliser les éléments suivants pour lancer Android Market sur la page de votre application. Il est un peu plus automatisé:

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

utiliser ce code

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