web-dev-qa-db-fra.com

Comment ouvrir le Google Play Store directement à partir de mon application Android?

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/Play Store). Je dois ouvrir l'application directement dans le Play Store.

473
Rajesh Kumar

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

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 bloc try/catch ici car une Exception sera émise si le Play Store n'est pas installé sur le périphérique cible.

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

1268
Eric

Beaucoup de réponses suggèrent d'utiliserUri.parse("market://details?id=" + appPackageName))pour ouvrir Google Play, mais je pense que cela est insuffisant en fait: 

Certaines applications tierces peuvent utiliser leurs propres filtres d'intention avec le code "market://" défini. Elles peuvent donc traiter l'Uri fourni au lieu de Google Play (j'ai connu cette situation avec l'application exemple, SnapPea). 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 note de l'application 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 lorsqu'un plus grand nombre d'applications que Google Play peuvent ouvrir notre objectif, la boîte de dialogue de sélection de l'application est ignorée et l'application GP est lancée directement.

UPDATE: Il semble parfois que l'application GP n'est ouverte que sans ouvrir le profil de l'application. Comme l'a suggéré TrevorWiley dans son commentaire, Intent.FLAG_ACTIVITY_CLEAR_TOP pourrait résoudre le problème. (Je ne l'ai pas encore testé moi-même ...)

Voir cette réponse pour comprendre ce que fait Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED.

139
Berťák

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

Lien officiel développeur Android

http://developer.Android.com/distribute/tools/promote/linking.html

Liaison à une page d'application

Depuis un site Web: http://play.google.com/store/apps/details?id=<package_name>

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

Lien vers une liste de produits

Depuis un site Web: http://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

Depuis un site Web: http://play.google.com/store/search?q=<search_query>&c=apps

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

64
Najib Puthawala

essaye ça

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=com.example.Android"));
startActivity(intent);
22
Youddh

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

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

L'important est que Google Play ou toute autre application ouvre en fait indépendamment.  

La plupart de ce que j'ai vu utilise l'approche des autres réponses et ce n'est pas ce dont j'avais besoin, espérons-le, cela aide quelqu'un.

Cordialement. 

18
Jonathan Caballero

Vous pouvez vérifier si Google Play Store app est installé et, le cas échéant, 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);
12
Paolo Rovelli

use market: //

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

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 obligez l'appareil à utiliser le Play Store. Si aucun Play Store n'est installé, la Exception sera interceptée.

9
M3-n50

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

6
almalkawi

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.

4
Alexandr

Très tard dans le parti Docs officiels sont ici. 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, transmettez "com.Android.vending" à Intent.setPackage() afin que les utilisateurs voient les détails de votre application dans 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)
3
Husnain Qasim

Comme la documentation officielle utilise https:// au lieu de market://, cela combine la réponse d'Eric et de M3-n50 avec la réutilisation du 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 s'il existe et revient aux valeurs par défaut.

1
serv-inc

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

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/

1
Tahmid
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)));
        }
    }
1
Anonymous

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

Voici le code final des réponses ci-dessus qui tente d’abord d’ouvrir l’application à l’aide de l’application Google Play Store et plus précisément de Play Store. En cas d’échec, la vue d’action sera lancée à l’aide de 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);
        }
    }
1
MoGa

Ma fonction d'extension 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 ton 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))
1
Arpan Sarkar

J'ai combiné les réponses Berťák et Stefano Munarini pour créer une solution hybride prenant en charge Noter cette application et Afficher plus d'applications scenario.

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

Utilisation

  • Pour ouvrir le profil des éditeurs
   @OnClick(R.id.ll_more_apps)
        public void showMoreApps() {
            openPlayStore(true, "Hitesh Sahu");
        }
  • Pour ouvrir une page d'application sur le PlayStore
@OnClick(R.id.ll_rate_this_app)
public void openAppInPlayStore() {
    openPlayStore(false, "");
}
0
Hitesh Sahu

Ce lien ouvrira automatiquement l'application sur Market: // si vous utilisez Android et dans le navigateur si vous utilisez un PC.

https://play.app.goo.gl/?link=https://play.google.com/store/apps/details?id=com.app.id&ddl=1&pcampaignid=web_ddl_1
0
Nikolay Shindarov

Une version de kotlin avec une syntaxe de repli et 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)
    }
}
0
kuzdu

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

Peuples, n'oubliez pas que vous pourriez en tirer quelque chose de plus. Je veux dire 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));
}
0
Alex