Link „Oceń tę aplikację” w aplikacji Sklep Google Play na telefonie


266

Chciałbym umieścić link „Oceń tę aplikację” w aplikacji na Androida, aby otworzyć listę aplikacji w aplikacji sklepu Google Play użytkownika na telefonie.

  1. Jaki kod muszę napisać, aby utworzyć market://lub http://link otwarty w aplikacji sklepu Google Play na telefonie?
  2. Gdzie umieszczasz kod?
  3. Czy ktoś ma przykładową implementację tego?
  4. Czy musisz określić ekran, na którym zostanie umieszczony link market://lub http://i który z nich najlepiej użyć - market://lub http://?

Ma wszystko, czego potrzebujesz: github.com/delight-im/AppRater I możesz wyszukać kod źródłowy, aby zrozumieć, jak to się robi.
caw

Odpowiedzi:


555

Otwieram Sklep Play z mojej aplikacji za pomocą następującego kodu:

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

Spowoduje to uruchomienie Sklepu Play przy otwartej stronie aplikacji. Użytkownik może go tam ocenić.


2
Gdzie w pliku androidmanifest.xml należy umieścić ten kod? Czy muszę dodać coś jeszcze? W jaki sposób odpowiada to rzeczywistemu linkowi lub przyciskowi na ekranie naciskanym przez użytkownika? Dzięki
Adreno

1
Nie musisz dodawać żadnego kodu do manifestu. Musisz tylko umieścić ten kod w OnClickListener swojego przycisku / linku, więc po kliknięciu przycisku kod zostanie wykonany i zostanie uruchomiony Sklep Play.
miguel.rodelas

61
To rozwiązanie nie ma znaczenia przy wycofywaniu się z rynku Play. Po naciśnięciu przycisku Wstecz nie następuje powrót do aplikacji. Jeśli chcesz, dodaj tę linię: intent.addFlags (Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
Jan Muller,

24
Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET: Ta stała została uznana za przestarzałą na poziomie API 21. Od API 21 działa ona identycznie jak FLAG_ACTIVITY_NEW_DOCUMENT, którego należy użyć zamiast tego.
xnagyg

1
Jeśli dzwonisz z klasy java niebędącej działaniem, musisz przekazać kontekst, taki jak context.startActivity (goToMarket);
DMur

47

Oto działający i aktualny kod :)

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

Wpisz kod w pole Activity, z którego chcesz go wywołać.
Gdy użytkownik kliknie przycisk, aby ocenić aplikację, wystarczy wywołać rateApp()funkcję.


Co Nuget Pakiet Dodam, nazw i co powinno być usingdla Intentbyć opłacalne typ? Znalazłem Android.Content , ale brakuje mi IntentXamarin Forms.
s3c

24

Zawsze używam tego kodu:

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

4
Zawsze jak jeden liner. :)
androidStud

używam go, ale pokazuje ten błąd - `android.content.ActivityNotFoundException: Nie znaleziono działania obsługującego zamiar {act = android.intent.action.VIEW dat = market: // details? id = PackageName}` - co mogę zrobić ?
Mina Dahesh

Czy możesz to sprawdzić ?
Cabezas

@Cabezas. ogólnie chcę pokazać cały istniejący rynek na telefonie. po kliknięciu, który z nich, jeśli moja aplikacja istniała, rynek wyświetla aplikację. Więc co powinienem zrobić?
Mina Dahesh

1
@Cabezas. używam tego kodu: `try {Intent intent = new Intent (Intent.ACTION_VIEW); intent.setData (Uri.parse ("bazaar: // details? id = came_note.maxsoft.com.vownote")); intent.setData (Uri.parse ("myket: // comment? id = samogłoska.maxsoft.com.vownote")); startActivity (cel); } catch (ActivityNotFoundException e1) {try {startActivity (new Intent (Intent.ACTION_VIEW, Uri.parse („MARKET URL”))); startActivity (nowa intencja (Intent.ACTION_VIEW, Uri.parse („MARKET URL”))); } catch (ActivityNotFoundException e2) {Toast.} `
Mina Dahesh

18

Dzieje się tak, jeśli opublikujesz swoją aplikację w Google Play Store i Amazon Appstore. Zajmuję się również sprawą, że użytkownicy (szczególnie w Chinach) nie mają zarówno sklepu z aplikacjami, jak i przeglądarki.

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

Nie odpowiada na pytanie.

co z kodem, aby otworzyć listę aplikacji w sklepie Amazon App Store?
isJulian00

Co Nuget Pakiet Dodam, nazw i co powinno być usingdla Intentbyć opłacalne typ? Znalazłem Android.Content , ale brakuje mi IntentXamarin Forms.
s3c

10

Zawsze możesz wywołać metodę getInstalledPackages () z klasy PackageManager i sprawdzić, czy klasa rynku jest zainstalowana. Możesz także użyć queryIntentActivities (), aby upewnić się, że twoja intencja będzie w stanie obsłużyć coś, nawet jeśli nie jest to aplikacja rynkowa. Jest to prawdopodobnie najlepsza rzecz do zrobienia, ponieważ jest najbardziej elastyczna i niezawodna.

Możesz sprawdzić, czy aplikacja rynkowa już tam jest

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

Jeśli lista zawiera co najmniej jeden wpis, rynek jest dostępny.

Aby uruchomić Android Market na stronie aplikacji, możesz użyć następujących opcji, jest to trochę bardziej zautomatyzowane:

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

Jeśli chcesz to przetestować na emulatorze, prawdopodobnie nie masz na nim zainstalowanego rynku: zobacz te linki, aby uzyskać więcej informacji:

Jak włączyć Android Market w emulatorze Google Android

Instalowanie Google Play na emulatorze Androida


Gdzie w pliku androidmanifest.xml należy umieścić ten kod? Czy muszę dodać coś jeszcze? W jaki sposób odpowiada to rzeczywistemu linkowi lub przyciskowi na ekranie naciskanym przez użytkownika? Dzięki
Adreno

8

Korzystam z tego podejścia, aby użytkownik oceniał moje aplikacje:

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

Po co to jest? - market://details?id=Mój link do aplikacji jest jakhttps:\\play.google.com\apps\details?id=
Sagar Balyan

2
@SagarBalyan, Jest to specjalny interfejs użytkownika do otwierania strony aplikacji w aplikacji Google Play Market. Jeśli zaczniesz aktywność z linkiem, który podałeś, android otworzy stronę aplikacji w domyślnej przeglądarce lub da ci wybór, którą aplikację przeglądarki uruchomić
gtgray

5

Wersja kotlin

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

Możesz tego użyć, to działa dla mnie

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

Zagraj w Store Store

 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

Innym podejściem, które może Ci pomóc, są Linkify. Jeśli mam TextView, który prosi użytkownika o ocenę aplikacji, mogę zamienić kilka słów w tekście, aby były podświetlone, a gdy użytkownik ich dotknie, otworzy się sklep z zabawkami, gotowy do oceny:

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

Punktem dotyczącym wszystkich odpowiedzi, które mają implementacje oparte na strategii getPackageName (), jest to, że użycie BuildConfig.APPLICATION_ID może być prostsze i działa dobrze, jeśli używasz tej samej bazy kodu do budowania wielu aplikacji o różnych identyfikatorach aplikacji (na przykład produkt z białą etykietą).


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 to nazwa konta programisty w Sklepie Play


2

Możesz użyć tego prostego kodu, aby ocenić swoją aplikację w swojej aktywności.

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

Po co to jest? - market://details?id=Mój link do aplikacji jest jakhttps:\\play.google.com\apps\details?id=
Sagar Balyan,

@SagarBalyan Jeśli użytkownik ma wiele rynków aplikacji, otworzy domyślny sklep lub pokaże zamiar dla każdego dostępnego sklepu.
Avi Parshan

2

Używam następującego podejścia, łącząc i odpowiedź bez użycia programowania opartego na wyjątkach, a także obsługuje flagę intencji wcześniejszą niż 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());

Ponieważ flaga intencji FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETjest przestarzała w interfejsie API 21, używam @SuppressWarnings("deprecation")znacznika w metodzie getRateIntent, ponieważ mój docelowy zestaw SDK aplikacji jest poniżej interfejsu API 21.


Wypróbowałem również oficjalny sposób Google sugerowany na ich stronie internetowej (6 grudnia 2019 r.). Widzę, że nie obsługuje przypadku, jeśli aplikacja Play Store nie jest zainstalowana:

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

Zadeklaruj metodę w swojej klasie aktywności. Następnie skopiuj i wklej poniższy kod.

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

}

Teraz wywołaj tę metodę z dowolnego miejsca w kodzie.

Postępuj zgodnie z obrazkiem poniżej z mojego praktycznego projektu.

wprowadź opis zdjęcia tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.