"Оцініть цю програму" - посилання в додатку магазину Google Play на телефоні


266

Я хотів би поставити посилання "Оцінити це додаток" у додатку для Android, щоб відкрити список додатків у користувальницькому магазині Google Play на своєму телефоні.

  1. Які символи ви бачите я повинен написати , щоб створити market://або http://-link відкритий в Play Маркеті Google на телефоні?
  2. Куди ви кладете код?
  3. Хтось має зразок реалізації цього?
  4. Чи потрібно вказати на екрані, де буде розміщено посилання market://чи http://посилання, і який найкраще використовувати - market://або http://?

Тут є все необхідне: github.com/delight-im/AppRater. Ви можете шукати вихідний код, щоб зрозуміти, як це робиться.
каре

Відповіді:


555

Я відкриваю Play Store у своєму додатку із таким кодом:

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

Це запустить Play Store із уже відкритою вашою сторінкою додатків. Користувач може це оцінити там.


2
Де в androidmanifest.xml я розміщую цей код? Чи потрібно ще щось додати? Як це відповідає фактичному посиланню чи кнопці на екрані, який користувач натискає? Спасибі
Адрено

1
Вам не потрібно додавати код до маніфесту. Вам просто потрібно розмістити цей код у OnClickListener своєї кнопки / посилання, тому при натисканні кнопки код виконується і запускається Play Store.
miguel.rodelas

61
Це рішення не рахується з backstack Play Market. Після натискання кнопки "назад" вас не повернуть у вашу заявку. Якщо ви хочете, додайте цей рядок: intent.addFlags (Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Намір.FLAG_ACTIVITY_MULTIPLE_TASK);
Ян Мюллер

24
Намір.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET: Ця константа була застаріла на рівні API 21. Що стосується API 21, вона працює ідентично FLAG_ACTIVITY_NEW_DOCUMENT, яку слід використовувати замість цього.
xnagyg

1
Якщо дзвонити з класу java без активності, вам потрібно передати такий контекст, як context.startActivity (goToMarket);
ДМур

47

Ось робочий і сучасний код :)

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

Введіть код у те, з якого Activityви хочете зателефонувати.
Коли користувач натискає кнопку, щоб оцінити додаток, просто зателефонуйте до rateApp()функції.


Що NuGet Пакет я повинен додати, і що простір імен я повинен бути usingдля Intentбути життєздатним типом? Я знайшов Android.Content , але я Intentвтрачаю програму у формах Xamarin.
s3c

24

Я завжди використовую цей код:

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

4
Завжди як один лайнер. :)
androidStud

я використовую його, але він показує цю помилку - `android.content.ActivityNotFoundException: не знайдено жодної активності для обробки наміру {act = android.intent.action.VIEW dat = market: // деталі? id = PackageName}` - що я можу зробити ?
Міна Даеш

Ви можете це перевірити ?
Cabezas

@Cabezas. Взагалі я хочу показати телефон, який існує на ринку. натиснувши на який із них, якщо мій додаток існував, ринок показує додаток. Так що мені робити?
Міна Даеш

1
@Cabezas. я використовую цей код: `try {Intent intennt = new Intent (Intent.ACTION_VIEW); intent.setData (Uri.parse ("базар: // подробиці? id = vow_note.maxsoft.com.vownote")); intent.setData (Uri.parse ("myket: // comment? id = vow_note.maxsoft.com.vownote")); startActivity (наміри); } ловити (ActivityNotFoundException e1) {спробувати {startActivity (новий намір (Intent.ACTION_VIEW, Uri.parse ("URL РИНКУ")); startActivity (новий намір (Intent.ACTION_VIEW, Uri.parse ("URL MARKET"))); } лов (ActivityNotFoundException e2) {Toast.} `
Міна Даеш

18

Це якщо ви публікуєте свою програму як у Google Play Store, так і в Amazon Appstore. Я також вирішую те, що користувачі (особливо в Китаї) не мають магазину додатків і браузера.

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

Не відповідає на питання.

як щодо коду, щоб відкрити список додатків у магазині Amazon?
isJulian00

Що NuGet Пакет я повинен додати, і що простір імен я повинен бути usingдля Intentбути життєздатним типом? Я знайшов Android.Content , але я Intentвтрачаю програму у формах Xamarin.
s3c

10

Ви завжди можете зателефонувати getInstalledPackages () з класу PackageManager і перевірити, чи встановлено ринковий клас. Ви також можете використовувати queryIntentActivities (), щоб переконатися, що створений вами намір зможе чимось оброблятись, навіть якщо це не ринкова програма. Це, мабуть, найкраще робити насправді, оскільки вона найбільш гнучка і надійна.

Ви можете перевірити, чи є там додаток для ринку

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

Якщо в списку принаймні один запис, ринок є.

Щоб запустити Android Market на сторінці свого додатка, ви можете скористатись наступним: це трохи більш автоматизовано:

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

Якщо ви хочете протестувати це на своєму емуляторі, ви, мабуть, не маєте на ньому встановленого ринку: див. Ці посилання для більш детальної інформації:

Як увімкнути Android Market в емуляторі Android Android

Встановлення Google Play на Емуляторі Android


Де в androidmanifest.xml я розміщую цей код? Чи потрібно ще щось додати? Як це відповідає фактичному посиланню чи кнопці на екрані, який користувач натискає? Спасибі
Адрено

8

Я використовую такий підхід, щоб змусити користувачів оцінювати свої програми:

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

Для чого це? - market://details?id=Моє посилання на додаток виглядає якhttps:\\play.google.com\apps\details?id=
Sagar Balyan

2
@SagarBalyan, Це спеціальний урі для відкриття сторінки вашого додатка в додатку Google Play на ринку. Якщо ви розпочнете діяльність із наданого вами посилання, андроїд відкриє сторінку вашого додатка в браузері за замовчуванням або дасть вам вибір, з якого браузера почати програму
gtgray

5

Котлінова версія

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

Ви можете скористатися цим, це працює для мене

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

Рейтинг магазину Play

 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. Якщо у мене TextView, який просить користувача оцінити додаток, я можу зв’язати пару слів у тексті, щоб вони були виділені, і коли користувач торкнеться їх, відкриється магазин ігор, готовий до їх перегляду:

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

Точка щодо всіх відповідей, що мають реалізацію на основі стратегії getPackageName (), полягає в тому, що використання BuildConfig.APPLICATION_ID може бути більш прямим вперед і добре працює, якщо ви використовуєте ту саму базу коду для створення декількох додатків з різними ідентифікаторами додатків (наприклад, продукт білої етикетки).


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 - назва облікового запису розробника в Play Store


2

Ви можете використовувати цей простий код, щоб оцінити додаток у своїй діяльності.

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

Для чого це? - market://details?id=Моє посилання на додаток схожеhttps:\\play.google.com\apps\details?id=
Sagar Balyan

@SagarBalyan Якщо користувач має кілька ринків додатків, він відкриє магазин за замовчуванням або покаже їм намір у кожному доступному магазині.
Аві Паршан

2

Я використовую наступний підхід, комбінуючи це та цю відповідь, не використовуючи програмування на основі винятку, а також підтримує прапор наміру перед 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());

Оскільки прапор наміру FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETзастарілий від API 21, я використовую @SuppressWarnings("deprecation")тег методу getRateIntent, оскільки цільовий пакет SDK мого додатка нижче API 21.


Я також спробував офіційний спосіб Google, запропонований на їхньому веб-сайті (6 грудня 2019 р.). Як я бачу, це не вирішує справи, якщо додаток Play Store не встановлено:

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

Заявіть метод у класі занять. Потім скопіюйте і вставте код нижче.

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

}

Тепер зателефонуйте цьому методу з будь-якого місця коду.

Дотримуйтесь зображення нижче з мого практичного проекту.

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.