Wie öffne ich den Google Play Store direkt über meine Android-Anwendung?

569

Ich habe den Google Play Store mit dem folgenden Code geöffnet

Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("https://play.google.com/store/apps/details?id=my packagename "));
startActivity(i);.

Es zeigt mir jedoch eine vollständige Aktionsansicht zur Auswahl der Option (Browser / Play Store). Ich muss die Anwendung direkt im Play Store öffnen.

Rajesh Kumar
quelle

Antworten:

1436

Sie können dies mit dem market://Präfix tun .

final String appPackageName = getPackageName(); // getPackageName() from Context or Activity object
try {
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
} catch (android.content.ActivityNotFoundException anfe) {
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
}

Wir verwenden hier einen try/catchBlock, da ein Block Exceptionausgelöst wird, wenn der Play Store nicht auf dem Zielgerät installiert ist.

HINWEIS : Jede App kann sich als fähig registrieren, mit dem market://details?id=<appId>Uri umzugehen. Wenn Sie gezielt auf Google Play abzielen möchten, überprüfen Sie die Antwort von Berťák

Eric
quelle
53
Wenn Sie zu allen Apps des Entwicklers umleiten möchten, verwenden Sie market://search?q=pub:"+devNameundhttp://play.google.com/store/search?q=pub:"+devName
Stefano Munarini
4
Diese Lösung funktioniert nicht, wenn eine Anwendung einen Absichtsfilter mit definiertem "market: //" - Schema verwendet. Siehe meine Antwort zum Öffnen von Google Play UND NUR der Google Play-Anwendung (oder Webbrowser, wenn GP nicht vorhanden ist). :-)
Berťák
18
Für Projekte mit dem Gradle-Build-System appPackageNamegilt dies in der Tat BuildConfig.APPLICATION_ID. Keine Context/ ActivityAbhängigkeiten, wodurch das Risiko von Speicherlecks verringert wird.
Christian García
3
Sie benötigen noch den Kontext, um die Absicht zu starten. Context.startActivity ()
wblaschko
2
Bei dieser Lösung wird davon ausgegangen, dass beabsichtigt ist, einen Webbrowser zu öffnen. Dies ist nicht immer der Fall (wie bei Android TV). Seien Sie also vorsichtig. Möglicherweise möchten Sie intent.resolveActivity (getPackageManager ()) verwenden, um zu bestimmen, was zu tun ist.
Coda
161

Viele Antworten hier schlagen vor, Uri.parse("market://details?id=" + appPackageName)) Google Play zu öffnen, aber ich denke, es ist in der Tat unzureichend :

Einige Anwendungen von Drittanbietern können eigene Intent-Filter mit "market://"definiertem Schema verwenden , sodass sie das bereitgestellte Uri anstelle von Google Play verarbeiten können (ich habe diese Situation mit der Anwendung egSnapPea erlebt). Die Frage lautet "Wie öffne ich den Google Play Store?", Daher gehe ich davon aus, dass Sie keine andere Anwendung öffnen möchten. Bitte beachten Sie auch, dass zB die App-Bewertung nur in der GP Store App usw. relevant ist.

Um Google Play UND NUR Google Play zu öffnen, verwende ich diese Methode:

public static void openAppRating(Context context) {
    // you can also use BuildConfig.APPLICATION_ID
    String appId = context.getPackageName();
    Intent rateIntent = new Intent(Intent.ACTION_VIEW,
        Uri.parse("market://details?id=" + appId));
    boolean marketFound = false;

    // find all applications able to handle our rateIntent
    final List<ResolveInfo> otherApps = context.getPackageManager()
        .queryIntentActivities(rateIntent, 0);
    for (ResolveInfo otherApp: otherApps) {
        // look for Google Play application
        if (otherApp.activityInfo.applicationInfo.packageName
                .equals("com.android.vending")) {

            ActivityInfo otherAppActivity = otherApp.activityInfo;
            ComponentName componentName = new ComponentName(
                    otherAppActivity.applicationInfo.packageName,
                    otherAppActivity.name
                    );
            // make sure it does NOT open in the stack of your activity
            rateIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            // task reparenting if needed
            rateIntent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
            // if the Google Play was already open in a search result
            //  this make sure it still go to the app page you requested
            rateIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            // this make sure only the Google Play app is allowed to
            // intercept the intent
            rateIntent.setComponent(componentName);
            context.startActivity(rateIntent);
            marketFound = true;
            break;

        }
    }

    // if GP not present on device, open web browser
    if (!marketFound) {
        Intent webIntent = new Intent(Intent.ACTION_VIEW,
            Uri.parse("https://play.google.com/store/apps/details?id="+appId));
        context.startActivity(webIntent);
    }
}

Der Punkt ist, dass, wenn mehr Anwendungen neben Google Play unsere Absicht öffnen können, der App-Auswahldialog übersprungen und die GP-App direkt gestartet wird.

UPDATE: Manchmal scheint es, dass nur die GP-App geöffnet wird, ohne das Profil der App zu öffnen. Wie TrevorWiley in seinem Kommentar vorschlug, Intent.FLAG_ACTIVITY_CLEAR_TOPkonnte das Problem behoben werden . (Ich habe es selbst noch nicht getestet ...)

In dieser Antwort erfahren Sie, was Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDEDfunktioniert.

Berťák
quelle
4
Dies ist zwar gut, scheint aber auch mit dem aktuellen Google Play-Build unzuverlässig zu sein. Wenn Sie eine andere Apps-Seite bei Google Play aufrufen und diesen Code auslösen, wird nur Google Play geöffnet, aber nicht zu Ihrer App.
zoltish
2
@zoltish, ich habe Intent.FLAG_ACTIVITY_CLEAR_TOP zu den Flags hinzugefügt und das scheint das Problem zu beheben
TrevorWiley
Ich habe Intent.FLAG_ACTIVITY_CLEAR_TOP | verwendet Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED funktioniert aber nicht. Keine neue Instanz im Play Store geöffnet
Praveen Kumar Verma
3
Was passiert, wenn Sie rateIntent.setPackage("com.android.vending")sicherstellen, dass die PlayStore-App diese Absicht anstelle des gesamten Codes verarbeitet?
dum4ll3
3
@ dum4ll3 Ich denke, Sie können, aber dieser Code überprüft auch implizit, ob die Google Play-App installiert ist. Wenn Sie es nicht überprüfen, müssen Sie für ActivityNotFound
Daniele Segato
81

Klicken Sie Schritt für Schritt auf den offiziellen Link für Android Developer, um den Code für Ihr Anwendungspaket aus dem Play Store zu erhalten, falls vorhanden oder Play Store-Apps nicht vorhanden sind. Öffnen Sie dann die Anwendung über den Webbrowser.

Offizieller Link für Android-Entwickler

https://developer.android.com/distribute/tools/promote/linking.html

Verknüpfen mit einer Anwendungsseite

Von einer Website: https://play.google.com/store/apps/details?id=<package_name>

Aus einer Android-App: market://details?id=<package_name>

Verknüpfung mit einer Produktliste

Von einer Website: https://play.google.com/store/search?q=pub:<publisher_name>

Aus einer Android-App: market://search?q=pub:<publisher_name>

Verknüpfung mit einem Suchergebnis

Von einer Website: https://play.google.com/store/search?q=<search_query>&c=apps

Aus einer Android-App: market://search?q=<seach_query>&c=apps

Najib Ahmed Puthawala
quelle
Die Verwendung von market: // Präfix wird nicht mehr empfohlen (überprüfen Sie den von Ihnen geposteten Link)
Greg Ennis
@ GregEnnis, wo Sie diesen Markt sehen: // Präfix wird nicht mehr empfohlen?
Loki
@loki Ich denke, der Punkt ist, dass es nicht mehr als Vorschlag aufgeführt ist. Wenn Sie diese Seite nach dem Wort durchsuchen, marketfinden Sie keine Lösung. Ich denke, der neue Weg besteht darin, einen Entwickler mit allgemeinerer Absicht abzufeuern.android.com/distribute/marketing-tools/… . Neuere Versionen der Play Store App haben wahrscheinlich einen Absichtsfilter für diesen URIhttps://play.google.com/store/apps/details?id=com.example.android
tir38
25

Versuche dies

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=com.example.android"));
startActivity(intent);
Youddh
quelle
1
Informationen zum unabhängigen Öffnen von Google Play (nicht in eine neue Ansicht in derselben App eingebettet) finden Sie in meiner Antwort.
Code4jhon
21

Alle oben genannten Antworten öffnen Google Play in einer neuen Ansicht derselben App, wenn Sie Google Play (oder eine andere App) unabhängig voneinander öffnen möchten:

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.android.vending");

// package name and activity
ComponentName comp = new ComponentName("com.android.vending",
                                       "com.google.android.finsky.activities.LaunchUrlHandlerActivity"); 
launchIntent.setComponent(comp);

// sample to open facebook app
launchIntent.setData(Uri.parse("market://details?id=com.facebook.katana"));
startActivity(launchIntent);

Der wichtige Teil ist, dass Google Play oder eine andere App unabhängig geöffnet wird.

Das meiste, was ich gesehen habe, verwendet den Ansatz der anderen Antworten und es war nicht das, was ich brauchte, hoffentlich hilft dies jemandem.

Grüße.

code4jhon
quelle
Was ist this.cordova? Wo sind die Variablendeklarationen? Wo wird callbackdeklariert und definiert?
Eric
Dies ist Teil eines Cordova-Plugins. Ich denke nicht, dass dies tatsächlich relevant ist. Sie benötigen lediglich eine Instanz von PackageManager und starten regelmäßig eine Aktivität, aber dies ist das Cordova-Plugin von github.com/lampaa, das ich überschrieben habe hier github.com/code4jhon/org.apache.cordova.startapp
code4jhon
4
Mein Punkt ist einfach, dass dieser Code nicht wirklich etwas ist, das Leute einfach auf ihre eigene App portieren können, um ihn zu verwenden. Das Fett zu reduzieren und nur die Kernmethode zu belassen, wäre für zukünftige Leser nützlich.
Eric
Ja, ich verstehe ... im Moment bin ich auf Hybrid-Apps. Kann nicht wirklich nativen Code wirklich testen. Aber ich denke, die Idee ist da. Wenn ich eine Chance habe, werde ich exakte native Zeilen hinzufügen.
Code4jhon
hoffentlich schafft es das @eric
code4jhon
14

Sie können überprüfen, ob die Google Play Store- App installiert ist, und in diesem Fall das Protokoll "market: //" verwenden.

final String my_package_name = "........."  // <- HERE YOUR PACKAGE NAME!!
String url = "";

try {
    //Check whether Google Play store is installed or not:
    this.getPackageManager().getPackageInfo("com.android.vending", 0);

    url = "market://details?id=" + my_package_name;
} catch ( final Exception e ) {
    url = "https://play.google.com/store/apps/details?id=" + my_package_name;
}


//Open the app page in Google Play store:
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startActivity(intent);
Paolo Rovelli
quelle
1
Informationen zum unabhängigen Öffnen von Google Play (nicht in eine neue Ansicht in derselben App eingebettet) finden Sie in meiner Antwort.
Code4jhon
12

Während Erics Antwort richtig ist und Berťáks Code auch funktioniert. Ich denke, das kombiniert beides eleganter.

try {
    Intent appStoreIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName));
    appStoreIntent.setPackage("com.android.vending");

    startActivity(appStoreIntent);
} catch (android.content.ActivityNotFoundException exception) {
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
}

Mit verwenden setPackageSie das Gerät, um den Play Store zu verwenden. Wenn kein Play Store installiert ist, Exceptionwird der abgefangen.

M3-n50
quelle
Die offiziellen Dokumente verwenden https://play.google.com/store/apps/details?id=anstelle von market:Wie kommt es? developer.android.com/distribute/marketing-tools/… Immer noch eine umfassende und kurze Antwort.
serv-inc
Ich bin mir nicht sicher, aber ich denke, es ist eine Verknüpfung, die Android in " play.google.com/store/apps " übersetzt. Sie können wahrscheinlich auch "market: //" in der Ausnahme verwenden.
M3-n50
11

benutze Markt: //

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + my_packagename));
Johannes Staehlin
quelle
7

Du kannst tun:

final Uri marketUri = Uri.parse("market://details?id=" + packageName);
startActivity(new Intent(Intent.ACTION_VIEW, marketUri));

Referenz hier erhalten :

Sie können auch den in der akzeptierten Antwort auf diese Frage beschriebenen Ansatz ausprobieren: Es kann nicht festgestellt werden, ob der Google Play Store auf einem Android-Gerät installiert ist oder nicht

Almalkawi
quelle
Ich habe es bereits mit diesem Code versucht, hier wird auch die Option zur Auswahl des Browsers / Play Stores angezeigt, da mein Gerät beide Apps installiert hat (Google Play Store / Browser).
Rajesh Kumar
Informationen zum unabhängigen Öffnen von Google Play (nicht in eine neue Ansicht in derselben App eingebettet) finden Sie in meiner Antwort.
Code4jhon
7

Sehr spät in der Party sind offizielle Dokumente hier. Und der beschriebene Code 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);

Wie Sie diese Absicht zu konfigurieren, passieren "com.android.vending"in Intent.setPackage()so dass die Nutzer der App Details im sehen Google Play Store App statt einer Chooser . für KOTLIN

val intent = Intent(Intent.ACTION_VIEW).apply {
    data = Uri.parse(
            "https://play.google.com/store/apps/details?id=com.example.android")
    setPackage("com.android.vending")
}
startActivity(intent)

Wenn Sie eine Sofort-App mit Google Play Instant veröffentlicht haben, können Sie die App wie folgt starten:

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri.Builder uriBuilder = Uri.parse("https://play.google.com/store/apps/details")
    .buildUpon()
    .appendQueryParameter("id", "com.example.android")
    .appendQueryParameter("launch", "true");

// Optional parameters, such as referrer, are passed onto the launched
// instant app. You can retrieve these parameters using
// Activity.getIntent().getData().
uriBuilder.appendQueryParameter("referrer", "exampleCampaignId");

intent.setData(uriBuilder.build());
intent.setPackage("com.android.vending");
startActivity(intent);

Für KOTLIN

val uriBuilder = Uri.parse("https://play.google.com/store/apps/details")
        .buildUpon()
        .appendQueryParameter("id", "com.example.android")
        .appendQueryParameter("launch", "true")

// Optional parameters, such as referrer, are passed onto the launched
// instant app. You can retrieve these parameters using Activity.intent.data.
uriBuilder.appendQueryParameter("referrer", "exampleCampaignId")

val intent = Intent(Intent.ACTION_VIEW).apply {
    data = uriBuilder.build()
    setPackage("com.android.vending")
}
startActivity(intent)
Husnain Qasim
quelle
Ich denke, das ist zumindest falsch Uri.parse("https://play.google.com/store/apps/details?id=. Auf einigen Geräten wird anstelle von Play Market ein Webbrowser geöffnet.
CoolMind
Der gesamte Code stammt aus offiziellen Dokumenten. Der Link ist auch im Antwortcode beigefügt, der hier als Kurzreferenz beschrieben wird.
Husnain Qasim
@CoolMind Der Grund dafür ist wahrscheinlich, dass diese Geräte eine ältere Version der Play Store-App haben, für die kein Vorsatzfilter vorhanden ist, der diesem URI entspricht.
tir38
@ tir38, vielleicht schon. Vielleicht haben sie keine Google Play Services oder sind nicht autorisiert, ich erinnere mich nicht.
CoolMind
6

In den offiziellen Dokumenten wird https://stattdessen market://die Antwort von Eric und M3-n50 mit der Wiederverwendung von Code kombiniert (wiederholen Sie sich nicht):

Intent intent = new Intent(Intent.ACTION_VIEW)
    .setData(Uri.parse("https://play.google.com/store/apps/details?id=" + getPackageName()));
try {
    startActivity(new Intent(intent)
                  .setPackage("com.android.vending"));
} catch (android.content.ActivityNotFoundException exception) {
    startActivity(intent);
}

Es versucht, mit der GPlay-App zu öffnen, falls vorhanden, und greift auf die Standardeinstellungen zurück.

serv-inc
quelle
5

Gebrauchsfertige Lösung:

public class GoogleServicesUtils {

    public static void openAppInGooglePlay(Context context) {
        final String appPackageName = context.getPackageName();
        try {
            context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
        } catch (android.content.ActivityNotFoundException e) { // if there is no Google Play on device
            context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
        }
    }

}

Basierend auf Erics Antwort.

Alexandr
quelle
1
Funktioniert es für dich? Es wird die Hauptseite von Google Play geöffnet, nicht die Seite meiner App.
Violette Giraffe
4

Kotlin:

Erweiterung:

fun Activity.openAppInGooglePlay(){

val appId = BuildConfig.APPLICATION_ID
try {
    this.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$appId")))
} catch (anfe: ActivityNotFoundException) {
    this.startActivity(
        Intent(
            Intent.ACTION_VIEW,
            Uri.parse("https://play.google.com/store/apps/details?id=$appId")
        )
    )
}}

Methode:

    fun openAppInGooglePlay(activity:Activity){

        val appId = BuildConfig.APPLICATION_ID
        try {
            activity.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$appId")))
        } catch (anfe: ActivityNotFoundException) {
            activity.startActivity(
                Intent(
                    Intent.ACTION_VIEW,
                    Uri.parse("https://play.google.com/store/apps/details?id=$appId")
                )
            )
        }
    }
Danielvgftv
quelle
3

Wenn Sie den Google Play Store über Ihre App öffnen möchten, verwenden Sie diesen Befehl direkt: market://details?gotohome=com.yourAppNameEs werden die Google Play Store-Seiten Ihrer App geöffnet.

Alle Apps eines bestimmten Publishers anzeigen

Suchen Sie nach Apps, deren Titel oder Beschreibung die Abfrage verwendet

Referenz: https://tricklio.com/market-details-gotohome-1/

Tahmid
quelle
3

Kotlin

fun openAppInPlayStore(appPackageName: String) {
    try {
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$appPackageName")))
    } catch (exception: android.content.ActivityNotFoundException) {
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=$appPackageName")))
    }
}
Khemraj
quelle
2
public void launchPlayStore(Context context, String packageName) {
    Intent intent = null;
    try {
            intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setData(Uri.parse("market://details?id=" + packageName));
            context.startActivity(intent);
        } catch (android.content.ActivityNotFoundException anfe) {
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + packageName)));
        }
    }
Sharath Kumar
quelle
2

Meine Kotlin-Entension funktioniert zu diesem Zweck

fun Context.canPerformIntent(intent: Intent): Boolean {
        val mgr = this.packageManager
        val list = mgr.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
        return list.size > 0
    }

Und in deiner Tätigkeit

val uri = if (canPerformIntent(Intent(Intent.ACTION_VIEW, Uri.parse("market://")))) {
            Uri.parse("market://details?id=" + appPackageName)
        } else {
            Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)
        }
        startActivity(Intent(Intent.ACTION_VIEW, uri))
Arpan Sarkar
quelle
2

Hier ist der endgültige Code aus den obigen Antworten, der zuerst versucht, die App mit der Google Play Store-App und speziell mit dem Play Store zu öffnen. Wenn dies fehlschlägt, wird die Aktionsansicht mit der Webversion gestartet: Credits to @Eric, @Jonathan Caballero

public void goToPlayStore() {
        String playStoreMarketUrl = "market://details?id=";
        String playStoreWebUrl = "https://play.google.com/store/apps/details?id=";
        String packageName = getActivity().getPackageName();
        try {
            Intent intent =  getActivity()
                            .getPackageManager()
                            .getLaunchIntentForPackage("com.android.vending");
            if (intent != null) {
                ComponentName androidComponent = new ComponentName("com.android.vending",
                        "com.google.android.finsky.activities.LaunchUrlHandlerActivity");
                intent.setComponent(androidComponent);
                intent.setData(Uri.parse(playStoreMarketUrl + packageName));
            } else {
                intent = new Intent(Intent.ACTION_VIEW, Uri.parse(playStoreMarketUrl + packageName));
            }
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(playStoreWebUrl + packageName));
            startActivity(intent);
        }
    }
MoGa
quelle
2

Dieser Link öffnet die App automatisch im Markt: // wenn Sie auf Android sind und im Browser, wenn Sie auf dem PC sind.

https://play.app.goo.gl/?link=https://play.google.com/store/apps/details?id=com.app.id&ddl=1&pcampaignid=web_ddl_1
Nikolay Shindarov
quelle
Was meinst du? Hast du meine Lösung ausprobiert? Es hat bei mir funktioniert.
Nikolay Shindarov
Eigentlich gibt es in meiner Aufgabe eine Webansicht und in der Webansicht muss ich eine beliebige URL laden. Wenn jedoch eine Playstore-URL geöffnet ist, wird die Schaltfläche zum Öffnen des Playstores angezeigt. Also muss ich die App öffnen, wenn ich auf diese Schaltfläche klicke. Es ist für jede Anwendung dynamisch. Wie kann ich es verwalten?
HPAndro
Versuchen Sie einfach den Linkhttps://play.app.goo.gl/?link=https://play.google.com/store/apps/details?id=com.app.id&ddl=1&pcampaignid=web_ddl_1
Nikolay Shindarov
1

Ich habe beide kombiniert Berťák und Stefano Munarini Antwort eine Hybrid - Lösung zu schaffen , die die Griffe Bewerte diese App und zeigen Weitere App - Szenario.

        /**
         * This method checks if GooglePlay is installed or not on the device and accordingly handle
         * Intents to view for rate App or Publisher's Profile
         *
         * @param showPublisherProfile pass true if you want to open Publisher Page else pass false to open APp page
         * @param publisherID          pass Dev ID if you have passed PublisherProfile true
         */
        public void openPlayStore(boolean showPublisherProfile, String publisherID) {

            //Error Handling
            if (publisherID == null || !publisherID.isEmpty()) {
                publisherID = "";
                //Log and continue
                Log.w("openPlayStore Method", "publisherID is invalid");
            }

            Intent openPlayStoreIntent;
            boolean isGooglePlayInstalled = false;

            if (showPublisherProfile) {
                //Open Publishers Profile on PlayStore
                openPlayStoreIntent = new Intent(Intent.ACTION_VIEW,
                        Uri.parse("market://search?q=pub:" + publisherID));
            } else {
                //Open this App on PlayStore
                openPlayStoreIntent = new Intent(Intent.ACTION_VIEW,
                        Uri.parse("market://details?id=" + getPackageName()));
            }

            // find all applications who can handle openPlayStoreIntent
            final List<ResolveInfo> otherApps = getPackageManager()
                    .queryIntentActivities(openPlayStoreIntent, 0);
            for (ResolveInfo otherApp : otherApps) {

                // look for Google Play application
                if (otherApp.activityInfo.applicationInfo.packageName.equals("com.android.vending")) {

                    ActivityInfo otherAppActivity = otherApp.activityInfo;
                    ComponentName componentName = new ComponentName(
                            otherAppActivity.applicationInfo.packageName,
                            otherAppActivity.name
                    );
                    // make sure it does NOT open in the stack of your activity
                    openPlayStoreIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    // task reparenting if needed
                    openPlayStoreIntent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
                    // if the Google Play was already open in a search result
                    //  this make sure it still go to the app page you requested
                    openPlayStoreIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    // this make sure only the Google Play app is allowed to
                    // intercept the intent
                    openPlayStoreIntent.setComponent(componentName);
                    startActivity(openPlayStoreIntent);
                    isGooglePlayInstalled = true;
                    break;

                }
            }
            // if Google Play is not Installed on the device, open web browser
            if (!isGooglePlayInstalled) {

                Intent webIntent;
                if (showPublisherProfile) {
                    //Open Publishers Profile on web browser
                    webIntent = new Intent(Intent.ACTION_VIEW,
                            Uri.parse("http://play.google.com/store/search?q=pub:" + getPackageName()));
                } else {
                    //Open this App on web browser
                    webIntent = new Intent(Intent.ACTION_VIEW,
                            Uri.parse("https://play.google.com/store/apps/details?id=" + getPackageName()));
                }
                startActivity(webIntent);
            }
        }

Verwendungszweck

  • So öffnen Sie das Publisher-Profil
   @OnClick(R.id.ll_more_apps)
        public void showMoreApps() {
            openPlayStore(true, "Hitesh Sahu");
        }
  • So öffnen Sie die App-Seite im PlayStore
@OnClick(R.id.ll_rate_this_app)
public void openAppInPlayStore() {
    openPlayStore(false, "");
}
Hitesh Sahu
quelle
Ich würde vorschlagen, diesen Code in kleinere Methoden zu unterteilen. Es ist schwer, wichtigen Code in diesen Spaghetti zu finden :) Außerdem suchen Sie nach "com.android.vending", was ist mit com.google.market
Aetherna
1

Leute, vergiss nicht, dass du tatsächlich etwas mehr daraus machen könntest. Ich meine zum Beispiel UTM-Tracking. https://developers.google.com/analytics/devguides/collection/android/v4/campaigns

public static final String MODULE_ICON_PACK_FREE = "com.example.iconpack_free";
public static final String APP_STORE_URI =
        "market://details?id=%s&referrer=utm_source=%s&utm_medium=app&utm_campaign=plugin";
public static final String APP_STORE_GENERIC_URI =
        "https://play.google.com/store/apps/details?id=%s&referrer=utm_source=%s&utm_medium=app&utm_campaign=plugin";

try {
    startActivity(new Intent(
        Intent.ACTION_VIEW,
        Uri.parse(String.format(Locale.US,
            APP_STORE_URI,
            MODULE_ICON_PACK_FREE,
            getPackageName()))).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
} catch (android.content.ActivityNotFoundException anfe) {
    startActivity(new Intent(
        Intent.ACTION_VIEW,
        Uri.parse(String.format(Locale.US,
            APP_STORE_GENERIC_URI,
            MODULE_ICON_PACK_FREE,
            getPackageName()))).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
}
Alex
quelle
1

Eine Kotlin-Version mit Fallback und aktueller Syntax

 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 or Intent.FLAG_ACTIVITY_NEW_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