Приглашение пользователей оценить приложение в App

в моем приложении для 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 ответов


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


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

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

вы также можете использовать 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();

сначала вам нужно подсчитать время использования приложения;

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

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


этот простой код достигнет того, что вы хотите, нет необходимости во внешних библиотеках или что-то необычное. Просто поместите его на событие 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
    }           

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

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

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

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


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

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

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

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

enter image description here