无法确定Android设备上是否安装了Google Play商店

21

这只是一个简单的问题,需要在设备上检查已安装的软件包...在我将操作系统升级到2.3.5之前,我可以使用以下代码找到市场/应用商店:

private static final String GooglePlayStorePackageName = "com.google.market";

void someMethod() {
    packageManager = getApplication().getPackageManager();
    List<PackageInfo> packages = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
    for (PackageInfo packageInfo : packages) {
        if (packageInfo.packageName.equals(GooglePlayStorePackageName)) {
            googlePlayStoreInstalled = true;
            break;
        }
    }
}

更新后,我无法找到用于指示应用程序已安装的包名称,尽管它在设备上,并且我可以访问市场。是否已更改了包名称?或者我可能是在错误的方向寻找?感谢,Adam。

更新:

检查软件包是否已安装的那种方法很愚蠢...一个更好的方法是:

protected final boolean isPackageInstalled(String packageName) {
    try {
        application.getPackageManager().getPackageInfo(packageName, 0);
    } catch (NameNotFoundException e) {
        return false;
    }
    return true;
}

以上代码运行得非常完美...谢谢 - pioneerBhawna
6个回答

31

请注意,这段代码已经有将近5年的历史,它并不是最优的解决方案。Google不喜欢没有充分理由就检查所有已安装的软件包,请确保查看其他答案。

软件包名称已更改,现在为com.android.vending


尝试:

private static final String GooglePlayStorePackageNameOld = "com.google.market";
private static final String GooglePlayStorePackageNameNew = "com.android.vending";

void someMethod() {
    PackageManager packageManager = getApplication().getPackageManager();
    List<PackageInfo> packages = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
    for (PackageInfo packageInfo : packages) {
        if (packageInfo.packageName.equals(GooglePlayStorePackageNameOld) ||
            packageInfo.packageName.equals(GooglePlayStorePackageNameNew)) {
            googlePlayStoreInstalled = true;
            break;
        }
    }
}

这意味着现在我必须检查两个应用程序是否存在... 嗯...不太好! - TacB0sS
2
但是为什么你在getInstalledPackages()中使用标志PackageManager.GET_UNINSTALLED_PACKAGES而不只是getInstalledPackages(0) - Prizoff
6
顺便说一下,应该是“com.android.vending”,而不是“com.google.vending”。我不确定旧名称。 - Prizoff
谢谢,一个评论:PackageManager的声明必须是:PackageManager packageManager,并且我想说与Prizoff相同的话。 - Codebeat
@Prizoff:你可以禁用Google Play商店应用程序。因此,尽管它不会计入已安装的应用程序中,但当我们传递标志GET_UNINSTALLED_PACKAGES时,它将被捕获。 - rajankz
那么为什么不使用这种方法 context.getPackageManager() .getLaunchIntentForPackage("com.google.market") != null || context.getPackageManager() .getLaunchIntentForPackage("com.android.vending") != null)?它不需要你遍历所有包。 - user924

12

1
这是非常新的...我将在接下来的几天内进行测试...到目前为止,代码看起来像一个大杂烩! - TacB0sS
确实是这样!但是,这就是谷歌惯常的做法 :) - saiyancoder
10
请注意,开发人员不应混淆Google Play商店应用和Google Play服务。 GooglePlayServicesUtil.isGooglePlayServicesAvailable() 检查后者,这可能是一个指标但不是必需的。该类具有两个软件包名称的常量。我的看法是,如果您想检查是否存在Google Play商店应用程序(例如,因为您想启动市场://意图),请使用PackageManager和GOOGLE_PLAY_STORE_PACKAGE。 - Michael
这个问题与服务无关。这个答案根本不应该在这里。 - Renetik
@Renetik 这个问题(和答案)是关于GooglePlayServices以及如何检测是否安装了GooglePlay的。它不是关于一般服务的,所以在这里提问是可以的。此外,问题标签是“android”和“google-play”,所以我不确定你的意思是什么。 - saiyancoder
显示剩余2条评论

9

正如Michael在评论中所述,Google Play服务与Google Play商店不同。使用以下方法确定您的设备上是否安装了Play Store:

public static boolean isPlayStoreInstalled(Context context){
    try {
        context.getPackageManager()
                .getPackageInfo(GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

1
请注意,这需要您将 com.google.android.gms:play-services-base:$playServicesVersion 添加到依赖项中。(它不会创建对已安装 Play 服务的运行时依赖。) - Thomas
1
@Thomas,不是必须的。 你可以用“com.android.vending”替换GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE。 - Andriy Antonov

2

在大多数情况下,我们希望找出Google Play商店是否已安装,以便在其中预加载某个应用程序页面。

为什么我们不能这样做:

final String appPackageName = getPackageName(); // get your app package name
try {
    Uri uri = Uri.parse("market://details?id=" + appPackageName);
    startActivity(new Intent(Intent.ACTION_VIEW, uri));
} catch (android.content.ActivityNotFoundException anfe) {
    // Google Play Store is not available.
}

0

检查 Google Play 商店是否已安装并激活:

Kotlin

companion object {
    private const val GOOGLE_PLAY_STORE_PACKAGE = "com.android.vending"
}

private fun isPlayStoreInstalled(context: Context): Boolean {
    return try {
        val packageInfo = context.packageManager.getPackageInfo(GOOGLE_PLAY_STORE_PACKAGE, 0)
        packageInfo.applicationInfo.enabled
    } catch (exc: PackageManager.NameNotFoundException) {
        false
    }
}

Java

   private static final String GOOGLE_PLAY_STORE_PACKAGE = "com.android.vending";

   private final boolean isPlayStoreInstalled(Context context) {
      boolean flag;
      try {
         PackageInfo packageInfo = context.getPackageManager().getPackageInfo(GOOGLE_PLAY_STORE_PACKAGE, 0);
         flag = packageInfo.applicationInfo.enabled;
      } catch (PackageManager.NameNotFoundException exc) {
         flag = false;
      }
      return flag;
   }

0

使用这段代码,您可以检查您的设备是否已安装Google Play服务

int val=GooglePlayServicesUtil.isGooglePlayServicesAvailable(MainActivity.this);
            if(val==ConnectionResult.SUCCESS)
            {
                play_installed=true;
            }
            else
            {
                play_installed=false;
            }

5
谷歌游戏服务不等于谷歌游戏商店。你可以安装商店但没有安装游戏服务,反之亦然。原帖询问的是商店。 - Michael
isGooglePlayServicesAvailable已被弃用。请改用GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) - Timo Bähr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接