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://?
Adreno
źródło
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ć.

miguel.rodelas
źródło
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ę.

György Benedek
źródło
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")));
Cabezas
źródło
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();
        }
    }
}
Hải Phong
źródło
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

K_Anas
źródło
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();
}
gtgray
źródło
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)
    }
}
kuzdu
źródło
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();
}
Suman
źródło
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())));
                }
            }
        });
Keshav Gera
źródło
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());
Granat Ulrich
źródło
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ą).

hecht
źródło
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

Pratik Saluja
źródło
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())));
}
SANJAY GUPTA
źródło
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);
Bruno Bieri
źródło
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

XpressGeek
źródło