如何检测是否安装了Google Play?(不是市场)

7
无论应用程序的名称是Google Play还是Market,包名都相同com.android.vending
我需要能够检测应用程序是Google Play还是Market,我已在PackageInfo中进行了检查,除了versionCodeversionName之外,没有其他有用的信息。
是否有人知道Google Play应用程序的第一个versionCodeversionName是什么?
如果有其他检测方法,请告诉我。

我认为你正在寻找getApplicationLabel() - adneal
http://android-er.blogspot.in/2012/12/check-if-correct-google-play-service.html - R KiranKumar
谢谢各位,我已经找到了答案:packageInfo.applicationInfo.loadLabel(packageManager); - Ali
5个回答

5
我找到了检查应用程序标签的方法。我一开始使用调试器查看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的值是多少? - Alfie Hanssen
抱歉,我没有Kindle,但如果您能找出应用程序包名称,那就足够了。它很可能是com.amazon.<something>。我会编写一个快速测试来打印与com.amazon.*匹配的所有包,并查看应用程序的包是什么。 - Ali
好的,包名很可能是 com.amazon.venezia - Ali

2

你也可以尝试这个更简化的解决方案:

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

2
这是不正确的。它检查的是Google Play服务,而不是Google Play商店“应用程序”来启动市场定向意图。 - Ian

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

在我的应用程序中,我会在启动之前检查是否可以打开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,而另一个答案则取决于一个库...... 当我只想知道是否显示链接有意义时,“尝试一下”就像你的答案所说的那样是最好的方法。 - Giszmo

1
你可以使用这个简单的代码片段,它易于理解并且考虑了不重新发明轮子,使用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


0

这可能是一个更好的例子,因为它允许用户在状态下执行某些操作,例如重新验证或更新。基于GCM客户端示例项目中的代码:

 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服务,而不是Google Play商店“应用程序”来启动市场定向意图。 - Jared Burrows

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