Как открыть Google Play Store прямо из моего приложения для Android?
Я открыл магазин Google Play, используя следующий код
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);.
Но он показывает мне полный вид действия для выбора опции (браузер / магазин воспроизведения). Мне нужно открыть приложение в play store напрямую.
28 ответов
Вы можете сделать это с помощью 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)));
}
Мы используем try/catch
блок здесь, потому что Exception
будет выброшен, если Play Store не установлен на целевом устройстве.
ПРИМЕЧАНИЕ: любое приложение может зарегистрироваться как способное обрабатывать market://details?id=<appId>
Ури, если вы хотите специально настроить Google Play, проверьте ответ Ber answerák
Многие ответы здесь предлагают использовать Uri.parse("market://details?id=" + appPackageName))
открыть Google Play, но я считаю, что этого недостаточно:
Некоторые сторонние приложения могут использовать свои собственные фильтры намерений с "market://"
схема определена, поэтому они могут обрабатывать предоставленный Uri вместо Google Play (я сталкивался с такой ситуацией с приложением egSnapPea). Вопрос "Как открыть Google Play Store?", Поэтому я предполагаю, что вы не хотите открывать какие-либо другие приложения. Также обратите внимание, что, например, рейтинг приложения относится только к приложению GP Store и т. Д.
Чтобы открыть Google Play И ТОЛЬКО Google Play, я использую этот метод:
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);
}
}
Дело в том, что когда наши приложения могут открыть больше приложений, кроме Google Play, диалоговое окно выбора приложений пропускается, и приложение GP запускается напрямую.
ОБНОВЛЕНИЕ: Иногда кажется, что он открывает только приложение GP, не открывая профиль приложения. Как предложил Тревор Уайли в своем комментарии, Intent.FLAG_ACTIVITY_CLEAR_TOP
может решить проблему. (Я сам еще не проверял...)
Смотрите этот ответ для понимания того, что Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
делает.
Перейдите по официальной ссылке Android Developer как учебное пособие. Шаг за шагом посмотрите и получите код для вашего пакета приложений из магазина Play Store, если он существует, или приложений Play Store не существует, затем откройте приложение из веб-браузера.
Официальная ссылка для разработчиков Android
http://developer.android.com/distribute/tools/promote/linking.html
Ссылка на страницу заявки
С веб-сайта: http://play.google.com/store/apps/details?id=<package_name>
Из приложения для Android: market://details?id=<package_name>
Ссылка на список товаров
С веб-сайта: http://play.google.com/store/search?q=pub:<publisher_name>
Из приложения для Android: market://search?q=pub:<publisher_name>
Ссылка на результат поиска
С веб-сайта: http://play.google.com/store/search?q=<search_query>&c=apps
Из приложения для Android: market://search?q=<seach_query>&c=apps
В то время как ответ Эрика правильный, и код Берняка тоже работает. Я думаю, что это сочетает в себе оба более элегантно.
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)));
}
Используя setPackage
, вы заставляете устройство использовать Play Store. Если не установлен Play Store, Exception
будет пойман.
Попробуй это
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=com.example.android"));
startActivity(intent);
Все приведенные выше ответы открывают Google Play в новом представлении того же приложения, если вы действительно хотите открыть Google Play (или любое другое приложение) независимо:
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);
Важной частью является то, что на самом деле открывает Google Play или любое другое приложение независимо.
Большая часть того, что я видел, использует подход других ответов, и это было не то, что мне нужно, надеюсь, это кому-нибудь поможет.
С уважением.
Вы можете проверить, установлено ли приложение Google Play Store, и, если это так, вы можете использовать протокол "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);
Использовать рынок://
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + my_packagename));
Как официальные документы используют https://
вместо market://
это объединяет ответ Эрика и M3-n50 с повторным использованием кода (не повторяйте себя):
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);
}
Он пытается открыть приложение GPlay, если оно существует, и возвращается к значению по умолчанию.
Некоторые ответы на этот вопрос устарели.
Что сработало для меня (в 2020 году), так это явно указать намерение пропустить средство выбора и напрямую открыть приложение магазина воспроизведения, согласно этой ссылке:
"Если вы хотите установить ссылку на свои продукты из приложения Android, создайте намерение, открывающее URL-адрес. При настройке этого намерения передайте com.android.vending в Intent.setPackage(), чтобы пользователи видели сведения о вашем приложении в приложение "Google Play Маркет" вместо средства выбора ".
Это код Kotlin, который я использовал, чтобы направлять пользователей к просмотру приложения, содержащего имя пакета com.google.android.apps.maps, в Google Play:
val intent = Intent(Intent.ACTION_VIEW).apply {
data = Uri.parse("http://play.google.com/store/apps/details?id=com.google.android.apps.maps")
setPackage("com.android.vending")
}
startActivity(intent)
Надеюсь, это кому-то поможет!
Котлин:
Расширение:
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")
)
)
}}
Метод:
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")
)
)
}
}
Очень поздно на вечеринке Официальные документы здесь. И код описан
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);
Когда вы настраиваете это намерение, передайте "com.android.vending"
в Intent.setPackage()
чтобы пользователи могли видеть детали вашего приложения в приложении Google Play Store, а не в меню выбора. для КОТЛИН
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)
Если вы опубликовали мгновенное приложение с помощью Google Play Instant, вы можете запустить его следующим образом:
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);
Для КОТЛИНА
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)
Котлин
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")))
}
}
Ты можешь сделать:
final Uri marketUri = Uri.parse("market://details?id=" + packageName);
startActivity(new Intent(Intent.ACTION_VIEW, marketUri));
получить ссылку здесь:
Вы также можете попробовать подход, описанный в принятом ответе на этот вопрос: невозможно определить, установлен ли магазин Google Play на устройстве Android или нет.
Готовое решение:
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)));
}
}
}
На основании ответа Эрика.
Эта ссылка автоматически откроет приложение в market:// если вы работаете на Android и в браузере, если вы на ПК.
https://play.app.goo.gl/?link=https://play.google.com/store/apps/details?id=com.app.id&ddl=1&pcampaignid=web_ddl_1
Если вы хотите открыть магазин Google Play из своего приложения, используйте следующую команду: market://details?gotohome=com.yourAppName
, он откроет страницы магазина Google Play вашего приложения.
- Веб: http://play.google.com/store/apps/details?id=
- Приложение: market://details? Id =
Показать все приложения определенного издателя
- Веб: http://play.google.com/store/search?q=pub:
- Приложение: market://search? Q = pub:
Поиск приложений, использующих запрос в заголовке или описании
- Веб: http://play.google.com/store/search?q=
- Приложение: market://search? Q =
Вот окончательный код из приведенных выше ответов, который сначала пытается открыть приложение с помощью приложения Google Play Store и, в частности, Play Store, в случае сбоя он запускает представление действия с помощью веб-версии: 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);
}
}
Я объединил ответ Берляка и Стефано Мунарини на создание гибридного решения, которое обрабатывает сценарии " Оцените это приложение" и " Показать больше приложений".
/**
* 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);
}
}
использование
- Чтобы открыть профиль издателей
@OnClick(R.id.ll_more_apps) public void showMoreApps() { openPlayStore(true, "Hitesh Sahu"); }
- Открыть страницу приложения в PlayStore
@OnClick(R.id.ll_rate_this_app) public void openAppInPlayStore() { openPlayStore(false, ""); }
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)));
}
}
KOTLIN: создайте расширение в контексте.
fun Context.openPlayStoreApp(pkgName:String?){
if(!pkgName.isNullOrEmpty()) {
try {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$pkgName")))
} catch (e: ActivityNotFoundException) {
startActivity(
Intent(
Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id=$pkgName")
)
)
}
}
}
Надеюсь, это должно сработать.
Моя функция энтузиазма kotlin для этой цели
fun Context.canPerformIntent(intent: Intent): Boolean {
val mgr = this.packageManager
val list = mgr.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
return list.size > 0
}
И в твоей деятельности
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))
Протестировано. Это должно работать нормально.
val context = LocalContext.current
val onOpenPlayStore: () -> Unit = {
try {
LOG.d(tag, "onOpenPlayStore ${context.packageName}")
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=${context.packageName}"))
startActivity(context, intent, null)
} catch (e: ActivityNotFoundException) {
var intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=${context.packageName}"))
startActivity(context, intent, null)
}
}
Котлинская версия с резервным и текущим синтаксисом
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)
}
}
Народы, не забывайте, что вы могли бы получить что-то большее от этого. Я имею в виду отслеживание 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));
}
Чтобы открыть приложение Google Play Store вместо выбора, используйте метод ниже. Если приложение не установлено в Google Play Store, оно перейдет в блокировку и откроет выбор.
Попробуйте ниже,
public static void launchPlayStore(Activity activity, 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));
activity.startActivity(intent);
} catch (android.content.ActivityNotFoundException anfe) {
activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + packageName)));
}
}
Для приложения ставки: перенаправить в Playstore. Во Flutter это можно сделать через канал платформы. Вот так
Часть флаттера: -
static const platform = const MethodChannel('rateApp'); // initialize
onTap:
platform.invokeMethod('urls', {'android_id': 'com.xyz'}),
Теперь Android Native Part (Java):
private static final String RATEAPP = "rateApp"; // initialize variable
// Теперь в функции ConfigureFlutterEngine:
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), RATEAPP)
.setMethodCallHandler(
(call, result) -> {
if (call.method.equals("urls") && call.hasArgument("android_id")) {
String id = call.argument("android_id").toString();
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("$uri" + id)));
} catch (android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + id)));
}
result.success("Done");
} else {
result.notImplemented();
}
}
);
Если вы хотите открыть Play Market для поиска приложений (например, "pdf"), используйте это:
private void openPlayMarket(String query) {
try {
// If Play Services are installed.
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=" + query)));
} catch (ActivityNotFoundException e) {
// Open in a browser.
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/search?q=" + query)));
}
}