【问题标题】:How to detect if Google Play is installed? (Not Market)如何检测是否安装了 Google Play? (不是市场)
【发布时间】:2013-03-14 05:17:49
【问题描述】:

无论安装的应用是Google Play还是Market,包名都是一样的com.android.vending

我需要能够检测应用程序是 Google Play 还是 Market,我已经检查了 PackageInfo,除了 versionCodeversionName 没有任何帮助。

有人知道第一个versionCode 是什么或versionName 是Google Play 应用吗?

如果有人知道任何其他检测方法,请告诉我。

【问题讨论】:

标签: android google-play


【解决方案1】:

我想出了如何检查应用程序标签。我正在使用调试器查看 packageInfo 中返回的所有内容,这就是我最初没有看到它的原因。

public static boolean isGooglePlayInstalled(Context context) {
    PackageManager pm = context.getPackageManager();
    boolean app_installed = false;
    try
    {
           PackageInfo info = pm.getPackageInfo("com.android.vending", PackageManager.GET_ACTIVITIES);
           String label = (String) info.applicationInfo.loadLabel(pm);
           app_installed = (label != null && !label.equals("Market"));
    }
    catch (PackageManager.NameNotFoundException e)
    {
           app_installed = false;
    }
    return app_installed;
}

【讨论】:

  • 你知道isAmazonMarketplaceInstalled 的等价物是什么吗?或者label 在亚马逊环境中的价值是什么?
  • 对不起,没有 kindle,但如果你能弄清楚应用程序包的名称,那就是你真正需要的。很可能是com.amazon.<something>。我会写一个快速测试来打印出所有匹配 com.amazon.* 的包,看看应用程序的包是什么。
  • 好吧,包名很可能是com.amazon.venezia
【解决方案2】:

您也可以尝试这个非常简化的解决方案:

public boolean isGooglePlayAvailable() {
        boolean googlePlayStoreInstalled;
        int val= GooglePlayServicesUtil.isGooglePlayServicesAvailable(LocationActivity.this);
        googlePlayStoreInstalled = val == ConnectionResult.SUCCESS;
        return googlePlayStoreInstalled;
    }

【讨论】:

  • 这是不正确的。这会检查 Google Play SERVICES 而不是 Google Play 商店“应用”以启动市场目标意图。
【解决方案3】:

在我的应用程序中,我检查是否可以在启动之前打开 Play 商店,例如:

    public static boolean isResolveActivity(Intent intent) {
            return App.getInstance().getPackageManager().resolveActivity(intent, PackageManager.GET_RESOLVED_FILTER) != null;
        }

   public void isResolveActivity(String appPackage) {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackage));

      if(isResolveActivity(intent)){
      ...open intent
      }
  }

【讨论】:

  • 我猜对我来说最好的答案。 com.android.vending 之前是 com.google.store,而另一个答案取决于图书馆......当我只想知道显示链接是否有意义时,最好的方法是“尝试一下”,就像你的答案一样。
【解决方案4】:

您可以使用这段简单的代码,它既简单又简单,并考虑到不要使用GooglePlayServicesUtil 重新发明轮子:

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

这将要求您将其添加到您的依赖项中:

compile 'com.google.android.gms:play-services-base:[PLAY_SERVICES_VERSION]'

最新的play-services 版本现在是:10.0.1

【讨论】:

    【解决方案5】:

    这可能是一个更好的例子,因为它允许用户可以对其执行某些操作的状态,即重新验证或更新。基于GCM client example project中的代码:

     public static boolean checkPlayServices(Activity activity) {
            int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity);
            if (resultCode != ConnectionResult.SUCCESS) {
                if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
                    GooglePlayServicesUtil.getErrorDialog(resultCode, activity,
                            PLAY_SERVICES_RESOLUTION_REQUEST).show();
                } else {
                    Toast.makeText(activity.getApplicationContext(), "This device is not supported.", Toast.LENGTH_LONG).show();
                    activity.finish();
                }
                return false;
            }
            return true;
        }
    

    【讨论】:

    • 这是不正确的。这会检查 Google Play SERVICES 而不是 Google Play 商店“应用”以启动市场目标意图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2021-10-10
    • 1970-01-01
    • 2010-11-11
    • 2016-12-18
    • 1970-01-01
    相关资源
    最近更新 更多