Предложите пользователю оценить приложение Android внутри приложения - PullRequest
30 голосов
/ 07 ноября 2011

В моем приложении для Android я хочу попросить пользователя в определенный момент оценить приложение в Android Market.

В поисках подхода я нашел код на этом сайте . Этот код работает очень хорошо.

Но, к сожалению, этот код вызывает сообщение об ошибке «Принудительное закрытие», когда Android Market не установлен на телефоне пользователя. Есть ли способ проверить, установлен ли Android market и, если нет, не пытаться выполнить код?

Вероятно, строка, которая вызывает ошибку, не может проанализировать URI:

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

И, кстати, есть ли другие вещи, которые можно улучшить в этом коде?

Edit:

Несколько лет спустя я поместил весь код в небольшой библиотечный проект: AppRater на GitHub

Ответы [ 10 ]

36 голосов
/ 13 декабря 2012

Вот весь код, который вам нужен (конгломерат ответа и предполагаемой информации Курта, плюс ссылка и вопрос):

/* 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 */
}
14 голосов
/ 07 ноября 2011

Вы всегда можете вызвать getInstalledPackages () из класса PackageManager и проверить, установлен ли рыночный класс.Вы также можете использовать queryIntentActivities () , чтобы убедиться, что созданное вами намерение может быть обработано чем-то, даже если это не рыночное приложение.Это, вероятно, лучшее, что можно сделать на самом деле, потому что оно наиболее гибкое и надежное.

9 голосов
/ 22 марта 2013

Вы также можете использовать 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();
5 голосов
/ 24 апреля 2016

Для начала нужно посчитать, сколько раз приложение использовало;

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();
}
1 голос
/ 22 августа 2015

Этот простой код достигнет того, что вы хотите, без необходимости использования внешних библиотек или чего-либо еще.Просто включите его в событие 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 голос
/ 08 августа 2012

Не все устройства Android используют рынок приложений.У Kindle и Nook есть своя собственная торговая площадка, поэтому необходимость в коде для проверки существования рынка является хорошей.Хотя должен быть способ отправить рейтинг на правильный рынок, независимо от того, какой он есть.Что-то, чтобы посмотреть.

0 голосов
/ 21 декабря 2016

используйте этот код

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 голосов
/ 17 марта 2015

Есть и другие варианты. Вот сравнение, которое поможет вам выбрать, какой из них использовать.

https://polljoy.com/blog/irate-vs-appirater-open-source-rating-prompts-alternatives

enter image description here

0 голосов
/ 19 июля 2014

Когда я использую "market: // details? Id =" + getApplicationContext (). GetPackageName (), это открывает для меня рынок mobogenie, поэтому я предпочитаю использовать https://play.google.com/store/apps/details?id=" + getApplicationContext (). GetPackageName ()

0 голосов
/ 07 ноября 2011

Если приложение было загружено через Android Market, у пользователей будет установлен Android Market на телефоне, поэтому я не вижу в этом проблемы. Это кажется очень странным ...

Вы можете использовать следующее для запуска Android Market на странице вашего приложения, оно немного более автоматизировано:

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