"Bewerten Sie diese App" -Link in der Google Play Store App auf dem Telefon

265

Ich möchte einen "Rate This App" -Link in eine Android-App einfügen, um die App-Liste in der Google Play Store-App des Benutzers auf seinem Handy zu öffnen.

  1. Welchen Code muss ich schreiben, um das market://oder zu erstellen?http:// -link in der Google Play Store-App auf dem Telefon geöffnet ist?
  2. Wo setzen Sie den Code ein?
  3. Hat jemand eine Beispielimplementierung davon?
  4. Müssen Sie den Bildschirm angeben, auf dem der Link market://oder http://platziert wird, und welcher Bildschirm am besten zu verwenden ist - market://oder http://?
Adreno
quelle
Dies hat alles, was Sie brauchen: github.com/delight-im/AppRater Und Sie können den Quellcode nachschlagen, um zu verstehen, wie es gemacht wird.
Caw

Antworten:

554

Ich öffne den Play Store über meine App mit dem folgenden Code:

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

Dadurch wird der Play Store mit Ihrer bereits geöffneten App-Seite gestartet. Der Benutzer kann es dort bewerten.

miguel.rodelas
quelle
2
Wo in der androidmanifest.xml platziere ich diesen Code? Muss ich noch etwas hinzufügen? Wie entspricht das einem tatsächlichen Link oder einer Schaltfläche auf einem Bildschirm, den der Benutzer drückt? Danke
Adreno
1
Sie müssen dem Manifest keinen Code hinzufügen. Sie müssen diesen Code nur im OnClickListener Ihrer Schaltfläche / Ihres Links platzieren. Wenn Sie also auf die Schaltfläche klicken, wird der Code ausgeführt und der Play Store gestartet.
miguel.rodelas
60
Diese Lösung zählt nicht mit dem Play Market Backstack. Nach dem Drücken der Zurück-Taste kehren Sie nicht zu Ihrer Anwendung zurück. Wenn Sie möchten, fügen Sie diese Zeile hinzu: intent.addFlags (Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
Jan Müller
23
Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET: Diese Konstante wurde in API-Ebene 21 veraltet. Ab API 21 funktioniert dies identisch mit FLAG_ACTIVITY_NEW_DOCUMENT, das stattdessen verwendet werden sollte.
Xnagyg
1
Wenn Sie von einer Nicht-Aktivitäts-Java-Klasse aufrufen, müssen Sie den Kontext wie context.startActivity (goToMarket) übergeben.
DMur
47

Hier ist ein funktionierender und aktueller Code :)

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

Geben Sie den Code in den Code ein, von dem aus ActivitySie ihn aufrufen möchten.
Wenn der Benutzer auf eine Schaltfläche klickt, um die App zu bewerten, rufen Sie einfach die rateApp()Funktion auf.

György Benedek
quelle
Was NuGet Paket sollte ich hinzufügen, und was Namespace sollte ich usingfür Intenteine praktikable Art zu sein? Ich habe Android.Content gefunden, bin aber mit IntentXamarin Forms ratlos .
s3c
24

Ich benutze immer diesen Code:

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=PackageName")));
Cabezas
quelle
4
Immer wie ein Liner. :)
androidStud
Ich benutze es, aber es zeigt diesen Fehler - `android.content.ActivityNotFoundException: Keine Aktivität gefunden, um Intent zu handhaben {act = android.intent.action.VIEW dat = market: // details? id = PackageName}` - was kann ich tun? ?
Mina Dahesh
Können Sie überprüfen diese ?
Cabezas
@Cabezas. Generell möchte ich alle existierenden Märkte am Telefon zeigen. Wenn Sie darauf klicken, welche davon vorhanden ist, zeigt der Markt die App an. Was soll ich also tun?
Mina Dahesh
1
@Cabezas. Ich benutze diesen Code: `try {Intent intent = new Intent (Intent.ACTION_VIEW); intent.setData (Uri.parse ("bazaar: // details? id = vow_note.maxsoft.com.vownote")); intent.setData (Uri.parse ("myket: // comment? id = vow_note.maxsoft.com.vownote")); startActivity (Absicht); } catch (ActivityNotFoundException e1) {try {startActivity (neue Absicht (Intent.ACTION_VIEW, Uri.parse ("MARKET URL")); startActivity (neue Absicht (Intent.ACTION_VIEW, Uri.parse ("MARKET URL"))); } catch (ActivityNotFoundException e2) {Toast.} `
Mina Dahesh
18

Dies ist der Fall, wenn Sie Ihre App sowohl im Google Play Store als auch im Amazon Appstore veröffentlichen. Ich behandle auch den Fall, dass Benutzer (insbesondere in China) nicht sowohl App Store als auch Browser haben.

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
quelle
Beantwortet die vorliegende Frage nicht.
Was ist mit Code zum Öffnen der Amazon App Store-Liste Ihrer App?
isJulian00
Was NuGet Paket sollte ich hinzufügen, und was Namespace sollte ich usingfür Intenteine praktikable Art zu sein? Ich habe Android.Content gefunden, bin aber mit IntentXamarin Forms ratlos .
s3c
10

Sie können getInstalledPackages () jederzeit aus der PackageManager- Klasse aufrufen und überprüfen, ob die Marktklasse installiert ist. Sie können auch queryIntentActivities () verwenden. , um sicherzustellen, dass der von Ihnen erstellte Intent von etwas verarbeitet werden kann, auch wenn es sich nicht um die Marktanwendung handelt. Dies ist wahrscheinlich das Beste, weil es am flexibelsten und robustesten ist.

Sie können überprüfen, ob die Markt-App vorhanden ist

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

Wenn die Liste mindestens einen Eintrag enthält, ist der Markt dort.

Sie können Folgendes verwenden, um Android Market auf der Seite Ihrer Anwendung zu starten. Es ist etwas automatisierter:

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

Wenn Sie dies auf Ihrem Emulator testen möchten, ist wahrscheinlich der Markt nicht darauf installiert: Weitere Informationen finden Sie unter diesen Links:

So aktivieren Sie den Android Market im Google Android Emulator

Installieren von Google Play auf dem Android Emulator

K_Anas
quelle
Wo in der androidmanifest.xml platziere ich diesen Code? Muss ich noch etwas hinzufügen? Wie entspricht das einem tatsächlichen Link oder einer Schaltfläche auf einem Bildschirm, den der Benutzer drückt? Danke
Adreno
8

Ich verwende diesen Ansatz, um Benutzer dazu zu bringen, meine Apps zu bewerten:

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
quelle
Wofür ist das? - market://details?id=Mein App-Link ist wiehttps:\\play.google.com\apps\details?id=
Sagar Balyan
2
@SagarBalyan, Es ist eine spezielle URL zum Öffnen Ihrer App-Seite in der Google Play Market-Anwendung. Wenn Sie die Aktivität mit dem von Ihnen angegebenen Link starten, öffnet Android Ihre App-Seite im Standardbrowser oder gibt Ihnen die Wahl, welche Browser-App gestartet werden soll
gtgray
5

Eine Kotlin-Version

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
quelle
4

Sie können dies verwenden, es funktioniert für mich

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
quelle
4

Play Store Bewertung

 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
quelle
3

Ein anderer Ansatz, der für Sie möglicherweise funktioniert, ist Linkify. Wenn ich eine Textansicht habe, in der der Benutzer aufgefordert wird, die App zu bewerten, kann ich einige Wörter im Text verknüpfen, damit sie hervorgehoben werden. Wenn der Benutzer sie berührt, wird der Play Store geöffnet und kann überprüft werden:

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
quelle
3

Ein Punkt in Bezug auf alle Antworten, deren Implementierung auf der Strategie getPackageName () basiert, ist, dass die Verwendung von BuildConfig.APPLICATION_ID möglicherweise einfacher ist und gut funktioniert, wenn Sie dieselbe Codebasis verwenden, um mehrere Apps mit unterschiedlichen App-IDs zu erstellen (z. B. a White-Label-Produkt).

hecht
quelle
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 ist der Name des Entwicklerkontos im Play Store

Pratik Saluja
quelle
2

Mit diesem einfachen Code können Sie Ihre App in Ihrer Aktivität bewerten.

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
quelle
Wofür ist das? - market://details?id=Mein App-Link ist wiehttps:\\play.google.com\apps\details?id=
Sagar Balyan
@SagarBalyan Wenn der Benutzer mehrere App-Märkte hat, öffnet er den Standard-Store oder zeigt jedem verfügbaren Store eine Absicht an.
Avi Parshan
2

Ich verwende den folgenden Ansatz, indem ich diese und diese Antwort ohne ausnahmebasierte Programmierung kombiniere und auch das Intent-Flag vor API 21 unterstütze.

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

Da das Intent-Flag FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETvon API 21 veraltet ist, verwende ich das @SuppressWarnings("deprecation")Tag für die getRateIntent-Methode, da mein App-Ziel-SDK unter API 21 liegt.


Ich habe auch den offiziellen Google-Weg ausprobiert, der auf ihrer Website vorgeschlagen wurde (6. Dezember 2019). Soweit ich sehe, wird der Fall nicht behandelt, wenn die Play Store-App nicht installiert ist:

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
quelle
0

Deklarieren Sie eine Methode in Ihrer Aktivitätsklasse. Kopieren Sie dann den folgenden Code und fügen Sie ihn ein.

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

}

Rufen Sie diese Methode nun von einer beliebigen Stelle Ihres Codes aus auf.

Folgen Sie dem Bild unten aus meinem praktischen Projekt.

Geben Sie hier die Bildbeschreibung ein

XpressGeek
quelle