【问题标题】:Cannot determine whether Google play store is installed or not on Android device无法确定 Android 设备上是否安装了 Google Play 商店
【发布时间】:2012-05-20 01:26:56
【问题描述】:

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

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

更新后由于某种原因,我根本找不到表明应用程序已安装的to包名称,虽然它在设备上,我可以访问市场。

包名有变化吗?还是我看错了?

谢谢,

亚当。

更新:

这是一种检查是否安装了软件包的愚蠢方法……更好的方法是:

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

【问题讨论】:

  • 以上代码运行良好...thanx

标签: android google-play


【解决方案1】:

请注意,这近 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;
        }
    }
}

【讨论】:

  • 这意味着我现在必须检查两个应用程序是否存在......嗯......不太好!
  • 但是你为什么在getInstalledPackages() 中使用标志PackageManager.GET_UNINSTALLED_PACKAGES 而不仅仅是getInstalledPackages(0)
  • 顺便说一下,不是"com.google.vending",而是"com.android.vending"。不知道旧名字。
  • 谢谢,一条评论:packageManager 的声明必须是:PackageManager packageManager 并且也想说和 Prizoff 一样。
  • @Prizoff:您可以禁用 Google Play 商店应用。因此,虽然它不计入已安装的应用程序,但当我们通过标志 GET_UNINSTALLED_PACKAGES 时,它将被拾取。
【解决方案2】:

GooglePlayServices 有一个实用程序类,其中包含处理此问题的方法:

isGooglePlayServicesAvailable(Context).

它为设备上播放服务的状态提供适当的错误对话框。

API 参考:

GoogleApiAvailability.isGooglePlayServicesAvailable(android.content.Context)

【讨论】:

  • 这是最近的...我将在接下来的几天内对其进行测试...到目前为止,代码看起来像是一团糟!
  • 确实如此!但好吧,这就是谷歌习惯做的事情:)
  • 请注意,开发者不应混淆 Google Play 商店应用和 Google Play 服务。 GooglePlayServicesUtil.isGooglePlayServicesAvailable() 检查后者,这可能是一个指标,但不是要求。但是,该类具有两个包名称的常量。恕我直言,如果您想检查现有的 Google Play 商店应用程序(例如,因为您想启动 market:// 意图,请将 PackageManager 与 GOOGLE_PLAY_STORE_PACKAGE 一起使用。
  • 绝对。你想编辑我的评论,让它包含这个吗?
【解决方案3】:

正如 Michael 在 cmets 中所述,Google Play 服务与 Google Play 商店不同。使用它来确定您的设备上是否安装了 Play 商店:

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

【讨论】:

  • 请注意,这需要您将com.google.android.gms:play-services-base:$playServicesVersion 添加到您的依赖项中。 (它不会对正在安装的 Play 服务产生运行时依赖。)
  • @Thomas,没必要。您可以将 GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE 替换为“com.android.vending”
【解决方案4】:

在大多数情况下,我们想知道是否安装了 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.
}

【讨论】:

    【解决方案5】:

    使用此代码,您可以检查您的设备上是否安装了 Google Play 服务

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

    【讨论】:

    • Google Play 服务!= Google Play 商店。您可以安装商店但不安装 GPS,反之亦然。 OP 要求商店。
    • isGooglePlayServicesAvailable 已弃用。请改用GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)
    【解决方案6】:

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

    科特林

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多