Jak otworzyć sklep Google Play bezpośrednio z mojej aplikacji na Androida?

569

Otworzyłem sklep Google Play, używając następującego kodu

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

Ale pokazuje mi pełny widok akcji, aby wybrać opcję (przeglądarka / sklep Play). Muszę otworzyć aplikację bezpośrednio w Sklepie Play.

Rajesh Kumar
źródło
Czy to odpowiada na twoje pytanie? Link „Oceń tę aplikację” w aplikacji Sklep Google Play na telefonie
Yoav Feuerstein

Odpowiedzi:

1436

Możesz to zrobić za pomocą market://prefiksu .

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

Używamy try/catchtutaj bloku, ponieważ Exceptionzostanie rzucony, jeśli Sklep Play nie jest zainstalowany na urządzeniu docelowym.

UWAGA : każda aplikacja może zarejestrować się jako zdolna do obsługi market://details?id=<appId>Uri, jeśli chcesz konkretnie kierować reklamy do Google Play, sprawdź odpowiedź Berťák

Eric
źródło
53
jeśli chcesz przekierować do wszystkich aplikacji dewelopera market://search?q=pub:"+devNameihttp://play.google.com/store/search?q=pub:"+devName
Stefano Munarini
4
To rozwiązanie nie działa, jeśli jakaś aplikacja korzysta z filtru umyślnego ze zdefiniowanym schematem „market: //”. Zobacz moją odpowiedź, jak otworzyć Google Play i TYLKO aplikację Google Play (lub przeglądarkę internetową, jeśli GP nie jest obecna). :-)
Berťák
18
W przypadku projektów korzystających z systemu kompilacji Gradle appPackageNamejest tak naprawdę BuildConfig.APPLICATION_ID. Brak Context/ Activityzależności, zmniejszające ryzyko wycieków pamięci.
Christian García,
3
Nadal potrzebujesz kontekstu, aby uruchomić zamiar. Context.startActivity ()
wblaschko,
2
To rozwiązanie zakłada, że ​​istnieje zamiar otwarcia przeglądarki internetowej. Nie zawsze jest to prawdą (jak w Android TV), więc bądź ostrożny. Możesz użyć intent.resolveActivity (getPackageManager ()), aby ustalić, co robić.
Coda
161

Wiele odpowiedzi tutaj sugeruje użycie Uri.parse("market://details?id=" + appPackageName)) do otwarcia Google Play, ale myślę, że w rzeczywistości jest to niewystarczające :

Niektóre aplikacje innych firm mogą używać własnych filtrów zamiarów ze "market://"zdefiniowanym schematem , dzięki czemu mogą przetwarzać dostarczone Uri zamiast Google Play (doświadczyłem takiej sytuacji z aplikacją np. SnapPea). Pytanie brzmi „Jak otworzyć sklep Google Play?”, Więc zakładam, że nie chcesz otwierać żadnej innej aplikacji. Należy również pamiętać, że np. Ocena aplikacji dotyczy tylko aplikacji GP Store itp.

Aby otworzyć Google Play i TYLKO Google Play, używam tej metody:

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

Chodzi o to, że gdy więcej aplikacji poza Google Play może otworzyć naszą intencję, okno wyboru aplikacji jest pomijane, a aplikacja GP jest uruchamiana bezpośrednio.

AKTUALIZACJA: Czasami wydaje się, że otwiera tylko aplikację GP, bez otwierania profilu aplikacji. Jak sugerował TrevorWiley w swoim komentarzu, Intent.FLAG_ACTIVITY_CLEAR_TOPproblem mógł rozwiązać. (Sam jeszcze tego nie testowałem ...)

Zobacz tę odpowiedź, aby zrozumieć, co Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDEDrobi.

Berťák
źródło
4
Chociaż jest to dobre, wydaje się również niewiarygodne z obecną wersją Google Play, jeśli wejdziesz na inną stronę aplikacji w Google Play, a następnie uruchomisz ten kod, po prostu otworzy Google Play, ale nie przejdzie do Twojej aplikacji.
zoltish
2
@zoltish, dodałem Intent.FLAG_ACTIVITY_CLEAR_TOP do flag i wydaje się, że to rozwiązuje problem
TrevorWiley
Użyłem Intent.FLAG_ACTIVITY_CLEAR_TOP | Zamiar.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, ale nie działa. nie ma żadnej nowej instancji otwartej w sklepie Play
Praveen Kumar Verma
3
Co się stanie, jeśli będziesz rateIntent.setPackage("com.android.vending")mieć pewność, że aplikacja PlayStore poradzi sobie z tym celem, zamiast całego tego kodu?
dum4ll3,
3
@ dum4ll3 Wydaje mi się, że możesz, ale ten kod również domyślnie sprawdza, czy aplikacja Google Play jest zainstalowana. Jeśli tego nie zaznaczysz, musisz złapać ActivityNotFound
Daniele Segato,
81

Idź na oficjalny link Android Developer jako samouczek krok po kroku, zobacz i pobierz kod pakietu aplikacji ze sklepu Play, jeśli istnieje lub aplikacje sklepu Play nie istnieją, otwórz aplikację z przeglądarki internetowej.

Oficjalny link dla programistów Androida

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

Łącze do strony aplikacji

Ze strony internetowej: https://play.google.com/store/apps/details?id=<package_name>

Z aplikacji na Androida: market://details?id=<package_name>

Łączenie z listą produktów

Ze strony internetowej: https://play.google.com/store/search?q=pub:<publisher_name>

Z aplikacji na Androida: market://search?q=pub:<publisher_name>

Linkowanie do wyniku wyszukiwania

Ze strony internetowej: https://play.google.com/store/search?q=<search_query>&c=apps

Z aplikacji na Androida: market://search?q=<seach_query>&c=apps

Najib Ahmed Puthawala
źródło
Korzystanie z prefiksu market: // nie jest już zalecane (sprawdź zamieszczony link)
Greg Ennis
@GregEnnis gdzie widzisz ten prefiks market: // nie jest już zalecany?
loki
@loki Myślę, że chodzi o to, że nie ma już na liście sugestii. Jeśli przeszukujesz tę stronę w poszukiwaniu słowa market, nie znajdziesz żadnego rozwiązania. Myślę, że nowy sposób to wystrzelenie bardziej ogólnego zamiaru developer.android.com/distribute/marketing-tools/… . Nowsze wersje aplikacji Sklep Play prawdopodobnie mają filtr https://play.google.com/store/apps/details?id=com.example.android
celowy
25

Spróbuj tego

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=com.example.android"));
startActivity(intent);
Youddh
źródło
1
Aby dowiedzieć się, jak otwierać Google Play niezależnie (nie jest osadzony w nowym widoku w tej samej aplikacji), sprawdź moją odpowiedź.
code4jhon
21

Wszystkie powyższe odpowiedzi otwierają Google Play w nowym widoku tej samej aplikacji, jeśli faktycznie chcesz otworzyć Google Play (lub dowolną inną aplikację) niezależnie:

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

Ważne jest to, że faktycznie otwiera Google Play lub dowolną inną aplikację niezależnie.

Większość tego, co widziałem, wykorzystuje podejście z innych odpowiedzi i nie było to, czego potrzebowałem, mam nadzieję, że to komuś pomaga.

Pozdrowienia.

code4jhon
źródło
Co to jest this.cordova? Gdzie są deklaracje zmiennych? Gdzie jest callbackzadeklarowane i zdefiniowane?
Eric
to jest część wtyczki Cordova, nie sądzę, żeby to było naprawdę istotne ... potrzebujesz tylko instancji PackageManager i rozpocznij działanie w zwykły sposób, ale jest to wtyczka Cordova z github.com/lampaa, którą nadpisałem tutaj github.com/code4jhon/org.apache.cordova.startapp
code4jhon
4
Chodzi mi po prostu o to, że ten kod nie jest tak naprawdę czymś, co ludzie mogą po prostu przenieść do własnej aplikacji w celu użycia. Odtłuszczanie i pozostawianie podstawowej metody byłoby przydatne dla przyszłych czytelników.
Eric
Tak, rozumiem ... na razie korzystam z aplikacji hybrydowych. Naprawdę nie mogę przetestować całkowicie natywnego kodu. Ale myślę, że pomysł istnieje. Jeśli mam szansę, dodam dokładne wiersze natywne.
code4jhon
mam nadzieję, że dzięki temu będzie @eric
code4jhon
14

Możesz sprawdzić, czy aplikacja Sklep Google Play jest zainstalowana, a jeśli tak, możesz użyć protokołu „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
źródło
1
Aby dowiedzieć się, jak otwierać Google Play niezależnie (nie jest osadzony w nowym widoku w tej samej aplikacji), sprawdź moją odpowiedź.
code4jhon
12

Chociaż odpowiedź Erica jest poprawna, a kod Berťáka również działa. Myślę, że łączy to oba bardziej elegancko.

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

Używając setPackage, zmuszasz urządzenie do korzystania ze Sklepu Play. Jeśli nie ma zainstalowanego Sklepu Play, Exceptionzostanie on złapany.

M3-n50
źródło
Oficjalne dokumenty używają https://play.google.com/store/apps/details?id=zamiast market:Jak to możliwe? developer.android.com/distribute/marketing-tools/... Nadal wyczerpująca i krótka odpowiedź.
serv-inc
Nie jestem pewien, ale myślę, że jest to skrót, który Android tłumaczy na „ play.google.com/store/apps ”. Prawdopodobnie możesz również użyć „market: //” w wyjątku.
M3-n50,
11

użyj market: //

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + my_packagename));
Johannes Staehlin
źródło
7

Możesz to zrobić:

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

uzyskaj odniesienie tutaj :

Możesz także wypróbować podejście opisane w zaakceptowanej odpowiedzi na to pytanie: Nie można ustalić, czy sklep Google Play jest zainstalowany na urządzeniu z Androidem, czy nie

almalkawi
źródło
Próbowałem już z tym kodem, pokazuje to również opcję wyboru przeglądarki / sklepu Play, ponieważ moje urządzenie zainstalowało obie aplikacje (Google Play Store / przeglądarka).
Rajesh Kumar
Aby dowiedzieć się, jak otwierać Google Play niezależnie (nie jest osadzony w nowym widoku w tej samej aplikacji), sprawdź moją odpowiedź.
code4jhon
7

Bardzo późno na imprezie Oficjalne dokumenty są tutaj. A opisany kod to

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

Podczas konfigurowania tego zamiaru przejdź "com.android.vending"do Intent.setPackage(), aby użytkownicy widzieli szczegóły Twojej aplikacji w aplikacji Sklep Google Play zamiast selektora . dla 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)

Jeśli opublikowałeś aplikację błyskawiczną za pomocą wyszukiwania dynamicznego Google Play, możesz uruchomić aplikację w następujący sposób:

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

Dla 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
źródło
Myślę, że to przynajmniej źle Uri.parse("https://play.google.com/store/apps/details?id=. Na niektórych urządzeniach otwiera przeglądarkę internetową zamiast Play Market.
CoolMind
Cały kod pochodzi z oficjalnych dokumentów. Link znajduje się również w kodzie odpowiedzi, który został opisany tutaj w celu szybkiego odniesienia.
Husnain Qasim
@Cool Powodem tego jest prawdopodobnie fakt, że te urządzenia mają starszą wersję aplikacji Sklep Play, która nie ma filtru zamiaru pasującego do tego identyfikatora URI.
tir38
@ tir38, może tak. Może nie mają usług Google Play lub nie są w nich autoryzowane, nie pamiętam.
CoolMind
6

Jak używają oficjalne dokumentyhttps:// zamiast market://, łączy to odpowiedź Erica i M3-n50 z ponownym użyciem kodu (nie powtarzaj się):

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

Próbuje się otworzyć za pomocą aplikacji GPlay, jeśli istnieje i powraca do ustawień domyślnych.

serv-inc
źródło
5

Gotowe do użycia rozwiązanie:

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

}

Na podstawie odpowiedzi Erica.

Alexandr
źródło
1
Czy Ci to pasuje? Otwiera główną stronę Google Play, a nie stronę mojej aplikacji.
Violet Giraffe
4

Kotlin:

Rozbudowa:

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

Metoda:

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

Jeśli chcesz otworzyć sklep Google Play z aplikacji, użyj tego polecenia bezpośrednio:, market://details?gotohome=com.yourAppNameotworzy się strony sklepu Google Play Twojej aplikacji.

Pokaż wszystkie aplikacje określonego wydawcy

Wyszukaj aplikacje korzystające z zapytania według jego tytułu lub opisu

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

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

W tym celu moja funkcja kotlin entension

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

I w twojej działalności

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

Oto końcowy kod z powyższych odpowiedzi, że pierwsza próba otwarcia aplikacji za pomocą aplikacji Sklep Google Play, a konkretnie Sklep Play, jeśli się nie powiedzie, uruchomi widok akcji przy użyciu wersji internetowej: Kredyty dla @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
źródło
2

Ten link otworzy aplikację automatycznie na rynku: // jeśli używasz Androida i przeglądarki, jeśli używasz komputera.

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
źródło
Co masz na myśli? Wypróbowałeś moje rozwiązanie? To zadziałało dla mnie.
Nikolay Shindarov
Właściwie w moim zadaniu jest przeglądanie stron internetowych, a przeglądanie stron internetowych wymaga załadowania dowolnego adresu URL. ale w tym przypadku, jeśli jest otwarty dowolny adres URL playstore, pokazuje on przycisk otwarcia playstore. więc muszę otworzyć aplikację po kliknięciu tego przycisku. będzie dynamiczny dla każdej aplikacji, więc jak mogę zarządzać?
hpAndro
Po prostu spróbuj 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

Połączyłem odpowiedzi zarówno Berťáka, jak i Stefano Munarini, aby stworzyć rozwiązanie hybrydowe, które obsługuje zarówno scenariusz Oceń tę aplikację, jak i Pokaż więcej aplikacji .

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

Stosowanie

  • Aby otworzyć profil wydawców
   @OnClick(R.id.ll_more_apps)
        public void showMoreApps() {
            openPlayStore(true, "Hitesh Sahu");
        }
  • Aby otworzyć stronę aplikacji w PlayStore
@OnClick(R.id.ll_rate_this_app)
public void openAppInPlayStore() {
    openPlayStore(false, "");
}
Hitesh Sahu
źródło
Sugeruję podzielić ten kod na mniejsze metody. Trudno znaleźć ważny kod w tym spaghetti :) Dodatkowo sprawdzasz „com.android.vending”, a co z com.google.market
Aetherna
1

Ludzie, nie zapominajcie, że moglibyście uzyskać coś więcej. Mam na myśli na przykład śledzenie UTM. 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
źródło
1

Kotlin verison z rezerwową i bieżącą składnią

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