Comment ouvrir le Google Play Store directement depuis mon application Android?

569

J'ai ouvert le Google Play Store en utilisant le code suivant

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

Mais il me montre une vue d'action complète pour sélectionner l'option (navigateur / magasin de lecture). Je dois ouvrir l'application directement sur Play Store.

Rajesh Kumar
la source
Est-ce que cela répond à votre question? Lien "Évaluez cette application" dans l'application Google Play Store sur le téléphone
Yoav Feuerstein

Réponses:

1437

Vous pouvez le faire en utilisant le market://préfixe .

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

Nous utilisons un try/catchbloc ici car un Exceptionsera levé si le Play Store n'est pas installé sur le périphérique cible.

REMARQUE : toute application peut s'inscrire comme capable de gérer l' market://details?id=<appId>URI, si vous souhaitez cibler spécifiquement Google Play, vérifiez la réponse Berťák

Eric
la source
53
si vous souhaitez rediriger vers toutes les applications du développeur, utilisez market://search?q=pub:"+devNameethttp://play.google.com/store/search?q=pub:"+devName
Stefano Munarini
4
Cette solution ne fonctionne pas si certaines applications utilisent un filtre d'intention avec un schéma "market: //" défini. Voir ma réponse comment ouvrir Google Play ET UNIQUEMENT l'application Google Play (ou navigateur Web si GP n'est pas présent). :-)
Berťák
18
Pour les projets utilisant le système de construction Gradle, appPackageNamec'est en fait BuildConfig.APPLICATION_ID. Aucune Context/ Activitydépendances, réduisant le risque de fuites de mémoire.
Christian García
3
Vous avez toujours besoin du contexte pour lancer l'intention. Context.startActivity ()
wblaschko
2
Cette solution suppose qu'il existe une intention d'ouvrir un navigateur Web. Ce n'est pas toujours vrai (comme sur Android TV) alors soyez prudent. Vous souhaiterez peut-être utiliser intent.resolveActivity (getPackageManager ()) pour déterminer quoi faire.
Coda
161

De nombreuses réponses suggèrent ici Uri.parse("market://details?id=" + appPackageName)) d'ouvrir Google Play, mais je pense que c'est insuffisant en fait:

Certaines applications tierces peuvent utiliser ses propres filtres d'intention avec un "market://"schéma défini , elles peuvent donc traiter l'URI fourni au lieu de Google Play (j'ai rencontré cette situation avec l'application egSnapPea). La question est "Comment ouvrir le Google Play Store?", Je suppose donc que vous ne voulez ouvrir aucune autre application. Veuillez également noter que, par exemple, la classification des applications n'est pertinente que dans l'application GP Store, etc.

Pour ouvrir Google Play ET UNIQUEMENT Google Play, j'utilise cette méthode:

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

Le fait est que lorsque plus d'applications à côté de Google Play peuvent ouvrir notre intention, la boîte de dialogue de sélection d'application est ignorée et l'application GP est démarrée directement.

MISE À JOUR: Parfois, il semble qu'il ouvre uniquement l'application GP, ​​sans ouvrir le profil de l'application. Comme TrevorWiley l'a suggéré dans son commentaire, Intent.FLAG_ACTIVITY_CLEAR_TOPpourrait résoudre le problème. (Je ne l'ai pas encore testé moi-même ...)

Voir cette réponse pour comprendre ce qui se Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDEDpasse.

Berťák
la source
4
Bien que cela soit bon, cela ne semble pas non plus fiable avec la version actuelle de Google Play, si vous entrez dans une autre page d'applications sur Google Play, puis déclenchez ce code, il ouvrira simplement Google Play mais ne se rendra pas dans votre application.
zoltish
2
@zoltish, j'ai ajouté Intent.FLAG_ACTIVITY_CLEAR_TOP aux drapeaux et cela semble résoudre le problème
TrevorWiley
J'ai utilisé Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED mais ne fonctionne pas. aucune nouvelle instance ouverte de Play Store
Praveen Kumar Verma
3
Que se passe-t-il si vous utilisez rateIntent.setPackage("com.android.vending")pour être sûr que l'application PlayStore va gérer cette intention, au lieu de tout ce code?
dum4ll3
3
@ dum4ll3 Je suppose que vous pouvez, mais ce code vérifie également implicitement si l'application Google Play est installée. Si vous ne le cochez pas, vous devez attraper ActivityNotFound
Daniele Segato
81

Allez sur le lien officiel du développeur Android comme tutoriel étape par étape, voyez et obtenez le code de votre package d'application sur Play Store s'il existe ou les applications Play Store n'existent pas, puis ouvrez l'application à partir du navigateur Web.

Lien officiel du développeur Android

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

Lien vers une page d'application

À partir d'un site Web: https://play.google.com/store/apps/details?id=<package_name>

Depuis une application Android: market://details?id=<package_name>

Lien vers une liste de produits

À partir d'un site Web: https://play.google.com/store/search?q=pub:<publisher_name>

Depuis une application Android: market://search?q=pub:<publisher_name>

Lien vers un résultat de recherche

À partir d'un site Web: https://play.google.com/store/search?q=<search_query>&c=apps

Depuis une application Android: market://search?q=<seach_query>&c=apps

Najib Ahmed Puthawala
la source
L'utilisation du préfixe market: // n'est plus recommandée (vérifiez le lien que vous avez publié)
Greg Ennis
@GregEnnis où vous voyez ce marché: // le préfixe n'est plus recommandé?
loki
@loki Je pense que le fait est que ce n'est plus une suggestion. Si vous recherchez le mot sur cette page, marketvous ne trouverez aucune solution. Je pense que la nouvelle façon est de lancer une intention plus générique developer.android.com/distribute/marketing-tools/… . Les versions plus récentes de l'application Play Store ont probablement un filtre d'intention pour cet URIhttps://play.google.com/store/apps/details?id=com.example.android
tir38
25

essaye ça

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=com.example.android"));
startActivity(intent);
Youddh
la source
1
Pour savoir comment ouvrir Google Play indépendamment (non intégré dans une nouvelle vue dans la même application), veuillez vérifier ma réponse.
code4jhon
21

Toutes les réponses ci-dessus ouvrent Google Play dans une nouvelle vue de la même application, si vous souhaitez réellement ouvrir Google Play (ou toute autre application) indépendamment:

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

La partie importante est que Google ouvre réellement Google Play ou toute autre application indépendamment.

La plupart de ce que j'ai vu utilise l'approche des autres réponses et ce n'était pas ce dont j'avais besoin j'espère que cela aide quelqu'un.

Cordialement.

code4jhon
la source
Qu'est-ce que c'est this.cordova? Où sont les déclarations de variables? Où est callbackdéclaré et défini?
Eric
cela fait partie d'un plugin Cordova, je ne pense pas que ce soit réellement pertinent ... vous avez juste besoin d'une instance de PackageManager et démarrer une activité de manière régulière mais c'est le plugin cordova de github.com/lampaa que j'ai écrasé ici github.com/code4jhon/org.apache.cordova.startapp
code4jhon
4
Mon point est simplement que ce code n'est pas vraiment quelque chose que les gens peuvent simplement porter sur leur propre application pour l'utiliser. Réduire la graisse et ne laisser que la méthode de base serait utile aux futurs lecteurs.
Eric
Oui, je comprends ... pour l'instant je suis sur des applications hybrides. Je ne peux pas vraiment tester du code complètement natif. Mais je pense que l'idée est là. Si j'ai une chance, j'ajouterai des lignes natives exactes.
code4jhon
j'espère que cela le rendra @eric
code4jhon
14

Vous pouvez vérifier si l'application Google Play Store est installée et, si c'est le cas, vous pouvez utiliser le protocole "market: //" .

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
la source
1
Pour savoir comment ouvrir Google Play indépendamment (non intégré dans une nouvelle vue dans la même application), veuillez vérifier ma réponse.
code4jhon
12

Alors que la réponse d'Eric est correcte et que le code de Berťák fonctionne également. Je pense que cela combine les deux plus élégamment.

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

En utilisant setPackage, vous forcez l'appareil à utiliser le Play Store. Si aucun Play Store n'est installé, le Exceptionsera capturé.

M3-n50
la source
Les documents officiels utilisent https://play.google.com/store/apps/details?id=au lieu de market:Comment se fait-il? developer.android.com/distribute/marketing-tools/… Encore une réponse complète et courte.
serv-inc
Je ne suis pas sûr, mais je pense que c'est un raccourci qu'Android traduit par " play.google.com/store/apps ". Vous pouvez aussi probablement utiliser "market: //" dans l'exception.
M3-n50
11

utiliser le marché: //

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

Tu peux faire:

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

obtenir la référence ici :

Vous pouvez également essayer l'approche décrite dans la réponse acceptée à cette question: Impossible de déterminer si Google Play Store est installé ou non sur un appareil Android

almalkawi
la source
J'ai déjà essayé avec ce code, cela montre également la possibilité de sélectionner le navigateur / play store, car mon appareil a installé les deux applications (google play store / browser).
Rajesh Kumar
Pour savoir comment ouvrir Google Play indépendamment (non intégré dans une nouvelle vue dans la même application), veuillez vérifier ma réponse.
code4jhon
7

Très tard dans la soirée, les documents officiels sont là. Et le code décrit est

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

Lorsque vous configurez cette intention, passez "com.android.vending"à Intent.setPackage()afin que les utilisateurs voient les détails de votre application dans l'application Google Play Store au lieu d'un sélecteur . pour 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)

Si vous avez publié une application instantanée à l'aide de Google Play Instant, vous pouvez lancer l'application comme suit:

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

Pour 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
la source
Je pense que c'est faux, du moins Uri.parse("https://play.google.com/store/apps/details?id=. Sur certains appareils, il ouvre un navigateur Web au lieu de Play Market.
CoolMind
Tout le code provient de documents officiels. Le lien est également attaché dans le code de réponse est décrit ici pour une référence rapide.
Husnain Qasim
@CoolMind la raison en est probablement parce que ces appareils ont une ancienne version de l'application Play Store qui n'a pas de filtre d'intention correspondant à cet URI.
tir38
@ tir38, peut-être que oui. Peut-être qu'ils n'ont pas les services Google Play ou qu'ils n'y sont pas autorisés, je ne m'en souviens pas.
CoolMind
6

Comme les documents officiels utilisent à la https://place de market://, cela combine la réponse d'Eric et M3-n50 avec la réutilisation de code (ne vous répétez pas):

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

Il essaie de s'ouvrir avec l'application GPlay si elle existe et revient à la valeur par défaut.

serv-inc
la source
5

Solution prête à l'emploi:

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

}

Basé sur la réponse d'Eric.

Alexandr
la source
1
Est-ce que ça marche pour toi? Il ouvre la page principale de Google Play, pas la page de mon application.
Violet Giraffe
4

Kotlin:

Extension:

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")
        )
    )
}}

Méthode:

    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
la source
3

Si vous souhaitez ouvrir Google Play Store à partir de votre application, utilisez directement cette commande:, market://details?gotohome=com.yourAppNamecela ouvrira les pages de Google Play Store de votre application .

Afficher toutes les applications d'un éditeur spécifique

Rechercher des applications utilisant la requête sur son titre ou sa description

Référence: https://tricklio.com/market-details-gotohome-1/

Tahmid
la source
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
la source
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
la source
2

Ma fonction d'entension kotlin à cet effet

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

Et dans votre activité

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
la source
2

Voici le code final des réponses ci-dessus qui tente pour la première fois d'ouvrir l'application en utilisant l'application Google Play Store et en particulier Play Store, s'il échoue, il démarrera la vue d'action en utilisant la version Web: Crédits à @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
la source
2

Ce lien ouvrira automatiquement l'application sur le marché: // si vous êtes sur Android et dans le navigateur si vous êtes sur PC.

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
la source
Que voulez-vous dire? Avez-vous essayé ma solution? Ça a marché pour moi.
Nikolay Shindarov
En fait, dans ma tâche, il y a une vue Web et dans la vue Web, je dois charger n'importe quelle URL. mais en ce que s'il y a une URL de Playstore ouverte, elle affiche le bouton Playstore ouvert. donc je dois ouvrir l'application en cliquant sur ce bouton. il sera dynamique pour n'importe quelle application, alors comment gérer?
hpAndro
Essayez simplement le lienhttps://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

J'ai combiné la réponse de Berťák et Stefano Munarini à la création d'une solution hybride qui gère à la fois le scénario Noter cette application et Afficher plus d'application .

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

Usage

  • Pour ouvrir le profil des éditeurs
   @OnClick(R.id.ll_more_apps)
        public void showMoreApps() {
            openPlayStore(true, "Hitesh Sahu");
        }
  • Pour ouvrir la page de l'application sur PlayStore
@OnClick(R.id.ll_rate_this_app)
public void openAppInPlayStore() {
    openPlayStore(false, "");
}
Hitesh Sahu
la source
Je suggère de diviser ce code en méthodes plus petites. Il est difficile de trouver du code important dans ce spaghetti :) De plus, vous recherchez "com.android.vending" et qu'en est-il de com.google.market
Aetherna
1

Peuples, n'oubliez pas que vous pourriez en tirer quelque chose de plus. Je veux dire le suivi UTM par exemple. 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
la source
1

Une version kotlin avec repli et syntaxe actuelle

 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
la source