Попросите пользователя оценить приложение Android в приложении
В моем приложении для Android я хочу, чтобы пользователь в определенный момент заказывал приложение на рынке Android.
Искав подход, я нашел код на этом веб-сайте. Этот код работает очень хорошо.
Но, к сожалению, этот код, похоже, вызывает сообщение об ошибке "Принудительное закрытие", когда рынок Android не установлен на пользовательском телефоне. Есть ли способ проверить, установлен ли Android-рынок, а если нет, не пытайтесь выполнить код?
Линия, которая вызывает ошибку, вероятно, такая, поскольку она не может проанализировать URI:
mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + APP_PNAME)));
И, между прочим, есть ли другие вещи, которые могут быть улучшены в этом коде?
Edit:
Несколько лет спустя я включил весь код в проект небольшой библиотеки: AppRater на GitHub
Ответы
Ответ 1
Вы всегда можете вызвать getInstalledPackages() из PackageManager и проверьте, установлен ли класс рынка. Вы также можете использовать queryIntentActivities(), чтобы убедиться, что созданный вами Intent будет обработан чем-то, даже если это не приложение на рынке, Это, наверное, лучше всего делать, потому что это самый гибкий и надежный.
Ответ 2
Здесь весь код, который вам нужен (конгломерат Курта отвечает и выводит информацию, плюс ссылку и вопрос):
/* 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 */
}
Ответ 3
Вы также можете использовать 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();
Ответ 4
Сначала вам нужно подсчитать время использования приложения;
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();
}
Ответ 5
Не все устройства Android используют рынок приложений. Kindle и Nook имеют свой собственный рынок, поэтому потребность в коде для проверки того, существует или нет рынок, является хорошим. Хотя должен быть способ отправить рейтинг на правильный рынок, независимо от того, какой он есть. Что-то посмотреть.
Ответ 6
Этот простой код достигнет того, чего вы хотите, не нужно для внешних библиотек или чего-нибудь интересного. Просто поставьте его на событие OnCreate в своей основной деятельности. Переменная RunEvery будет определять, как часто появляется сообщение о скорости. В примере он установлен в 10.
// Count times app has been opened, display rating message after number of times
// By Rafael Duval
try {
// Get the app 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
}
Ответ 7
Если приложение было загружено через Android Market, у пользователей будет установлен Android Market на телефоне, поэтому я действительно не вижу в этом проблемы. Это кажется очень странным...
Вы можете использовать следующее для запуска Android Market на своей странице приложения, это немного более автоматизировано:
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("market://details?id=" + getPackageName()));
startActivity(i);
Ответ 8
Когда я использую "market://details? id =" + getApplicationContext(). getPackageName() открывает мне рынок mobogenie, поэтому я предпочитаю использовать https://play.google.com/store/apps/details?id= "+ getApplicationContext(). getPackageName()
Ответ 9
используйте этот код
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())));
}
Ответ 10
Теперь есть другие варианты. Вот сравнение, которое поможет вам выбрать, какой из них использовать.
https://polljoy.com/blog/irate-vs-appirater-open-source-rating-prompts-alternatives
![enter image description here]()